在Jython中导入PyCrypto的问题

时间:2010-06-10 18:31:52

标签: python jython pycrypto

我目前正试图在jython中运行python bittorrent跟踪器,我遇到了这个问题: 跟踪器使用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;

import 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");
    }
}

提前感谢能够提供任何帮助的任何人。

2 个答案:

答案 0 :(得分:4)

这可能是因为pycrypto是一个C扩展,如果没有这个扩展的Java包装,Jython将无法调用它。

答案 1 :(得分:0)

我不确定这适用于您的情况,但是一些谷歌搜索导致了这一点:

(来自http://wiki.python.org/jython/JythonFaq/InstallingJython

  

Jython找不到你的Java类,   即使它存在于课堂上   路径。这显示为“ImportError:   无法导入名称xxx“或   “AttributeError:java包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目录并放   在CLASSPATH中使用jython.jar或者使用   java --classpath选项。

     

(来自Jython-users邮件列表)

另一个类似的问题,但不同的是:

(来自http://bugs.jython.org/issue1878866

  

我在Linux中使用jython 2.5遇到了类似的问题。内   jython2.5.0 / lib / site-packages a有一个foo目录,其中有一个   Java类(Bar.class)和jython类(BarPy.py)。我也放了一个   空__init__.py文件。在jython解释器环境中,我可以   总是像这样导入Bar:“来自foo import Bar”但是我不能   导入BarPy。如果我从目录中删除java类,那么我可以   导入jython脚本