Jython: ImportError: нет модуля с именем multiarray - PullRequest
2 голосов
/ 05 августа 2011

Когда я пытаюсь вызвать файл и его метод с использованием Jython, он показывает следующую ошибку, в то время как мои Numpy, Python и NLTK установлены правильно и работают правильно, если я запускаю напрямую из оболочки Python

File "C:\Python26\Lib\site-packages\numpy\core\__init__.py", line 5, in <module>
import multiarray
ImportError: No module named multiarray

Код, который я использую, прост:

PyInstance hello = ie.createClass("PreProcessing", "None");  
PyString str = new PyString("my name is abcd");
PyObject po = hello.invoke("preprocess", str);
System.out.println(po);

Когда я запускаю только файл python, содержащий класс PreProcessing и вызывающий метод preprocess, он работает нормально, но с Jython выдает ошибку.

Jython не может импортировать все библиотеки, в которых хранится только скомпилированная версия, а не сам код класса. Например, вместо multiarray.py скомпилированная версия имеет только multiarray.pyd, поэтому в Jython его не обнаруживают.

Почему это показывает такое поведение? Как это решить?

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 18 июня 2012

Я знаю, что это старая ветка, но недавно я столкнулся с этой же проблемой и смог ее решить, и я считаю, что решение должно быть здесь на случай, если кто-нибудь в будущем столкнется с ней.Как сказано выше, Jython не может работать с предварительно скомпилированными c-файлами numpy, но в nltk использование numpy очень ограничено, и довольно просто переписать затронутые биты кода.Это то, что я сделал, и я уверен, что это не самое эффективное в вычислительном отношении решение, но оно работает.Этот код находится в nltk.metrics.Segmentation, и я буду вставлять только соответствующий код, но он будет немного больше.

def _init_mat(nrows, ncols, ins_cost, del_cost):
    mat = [[4.97232652e-299 for x in xrange(ncols)] for x in xrange(nrows)]
    for x in range(0,ncols):       
        mat[0][x] = x * ins_cost
    for x in range(0, nrows):
        mat[x][0] = x * del_cost
    return mat

def _ghd_aux(mat, rowv, colv, ins_cost, del_cost, shift_cost_coeff):
    for i, rowi in enumerate(rowv):
        for j, colj in enumerate(colv):          
            shift_cost = shift_cost_coeff * abs(rowi - colj) + mat[i][j]
            if rowi == colj:
                # boundaries are at the same location, no transformation required
                tcost = mat[i][j]
            elif rowi > colj:
                # boundary match through a deletion
                tcost = del_cost + mat[i][j + 1]
            else:
                # boundary match through an insertion
                tcost = ins_cost + mat[i + 1][j]
            mat[i + 1][j + 1] = min(tcost, shift_cost)

Также в конце ghd измените инструкцию return на

return mat[-1][-1]

Надеюсь, это кому-нибудь поможет!Я не знаю, есть ли другие места, где это имеет какое-либо значение, но это единственное, с чем я столкнулся.Если есть какие-либо другие проблемы такого рода, они могут быть решены таким же образом (используя список списков вместо простого массива), опять же, вы, вероятно, потеряете некоторую эффективность, но это работает.

1 голос
/ 06 августа 2011

jython - это Java. Части Numpy реализованы как расширения c Python (файлы .pyd). Некоторые части реализованы в виде файлов .py, которые будут отлично работать в Jython. Однако они не могут функционировать без доступа к коду уровня C. В настоящее время в jython есть возможность использовать numpy. См:

Использование NumPy и Cpython с Jython Или же Есть ли хороший клон NumPy для Jython?

Для недавних обсуждений альтернатив.

...