Проблема с импортом с PyCrypto в Jython

В настоящее время я пытаюсь запустить битторрент-трекер python внутри jython, и я столкнулся с этой проблемой: трекер использует библиотеку PyCrypto, которую я скомпилировал для своей платформы и добавил в путь python. Однако, когда я пытаюсь запустить код, я получаю следующую ошибку:

Exception in thread "MainThread" Traceback (most recent call last):
  File "./python_dep/BitTorrent-5.2.2/bittorrent-tracker.py", line 21, in <module>
    from BitTorrent.track import track
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/track.py", line 50, in <module>
    from BitTorrent.UI import Size
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/UI.py", line 37, in <module>
    from BitTorrent.MultiTorrent import UnknownInfohash, TorrentAlreadyInQueue, TorrentAlreadyRunning, TorrentNotRunning
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/MultiTorrent.py", line 25, in <module>
    from BitTorrent.Torrent import Feedback, Torrent
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/Torrent.py", line 32, in <module>
    from BitTorrent.ConnectionManager import ConnectionManager
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/ConnectionManager.py", line 22, in <module>
    from BitTorrent.Connector import Connector
  File "./python_dep/BitTorrent-5.2.2/BitTorrent/Connector.py", line 27, in <module>
    from Crypto.Cipher import ARC4
ImportError: cannot import name ARC4
Java Result: 1

Я почти уверен, что библиотека находится в пути python, потому что команда

import Crypto.Cipher

работает, пока

from Crypto.Cipher import ARC4

не. Код Java, который я запускаю, выглядит так:

package jythTest;

импортировать org.python.util.PythonInterpreter;

public class Main {

    public static void main(String[] args) {
         PythonInterpreter pythonInterpreter = new PythonInterpreter();
         pythonInterpreter.exec("import sys");


         pythonInterpreter.exec("sys.path.append(\"./python_dep/BitTorrent-5.2.2/\")");
         pythonInterpreter.exec("sys.path.append(\"./python_dep/Twisted-10.0.0/\")");
         pythonInterpreter.exec("sys.path.append(\"./python_dep/Zope-3.4.0/build/lib.linux-i686-2.6\")");
         pythonInterpreter.exec("sys.path.append(\"./python_dep\")");
         pythonInterpreter.exec("sys.path.append(\"./python_dep/pycrypto-2.0.1/build/lib.linux-i686-2.6\")");
         pythonInterpreter.exec("sys.path.append(\"import Crypto.Cipher\")");

         //pythonInterpreter.exec("print sys.path");
         pythonInterpreter.execfile("./python_dep/BitTorrent-5.2.2/bittorrent-tracker.py");
    }
}

Заранее благодарим всех, кто может оказать какую-либо помощь.


person Arg    schedule 10.06.2010    source источник


Ответы (2)


Это происходит, вероятно, потому, что pycrypto является расширением C, и Jython не сможет вызвать его без Java-обертки для этого расширения.

person Tarantula    schedule 10.06.2010
comment
хм, но другие расширения C, похоже, работают нормально. Кроме того, он может вызывать сам модуль, но не будет вызывать функции. - person Arg; 11.06.2010
comment
Какие расширения? Возможно, ARC4 — это расширение, а Crypto.Cipher — просто оболочка Python в чистом Python. - person Tarantula; 11.06.2010

Я не уверен, что это относится к вашей ситуации, но некоторые поисковые запросы привели к этому:

(из http://wiki.python.org/jython/JythonFaq/InstallingJython)

Jython не может найти ваш класс Java, даже если он существует в пути к классу. Это отображается как «ImportError: невозможно импортировать имя xxx» или «AttributeError: java package xxx» не имеет атрибута «yyy»

Это происходит, когда Jython установлен как расширение Java (т. е. когда jython.jar установлен в java\jre\lib\ext), а ваши классы установлены в пути к классам.

Причина в том, что расширения Java могут видеть только другие расширения, а не другие классы, определенные в CLASSPATH или переданные в java с помощью параметра --classpath.

Есть два способа исправить это:

1) Переместите свои классы в каталог java\jre\lib\ext.

2) Удалите jython.jar из каталога java\jre\lib\ext и поместите jython.jar в CLASSPATH или используйте параметр java --classpath.

(из списка рассылки пользователей Jython)

И еще одна похожая проблема, но все же другая:

(из http://bugs.jython.org/issue1878866)

У меня похожая проблема в Linux с jython 2.5. Внутри jython2.5.0/Lib/site-packages есть каталог foo, в котором есть класс Java (Bar.class) и класс jython (BarPy.py). я также поместил пустой файл __init__.py. В среде интерпретатора jython я всегда могу импортировать Bar следующим образом: «из foo import Bar», однако я не могу импортировать BarPy. Если я удалю класс java из каталога, я смогу импортировать скрипт jython

person Peter Jaric    schedule 10.06.2010
comment
интересно, у меня нет jython, установленного как расширение java, я просто создал автономную банку lib и добавил ее в проект - person Arg; 11.06.2010