2010-06-10 75 views
3

我目前正试图让python bittorrent跟踪器在jython中运行,我遇到了这个问题: 跟踪器使用PyCrypto库,我为我的平台编译并添加到python路径中。当我尝试运行代码,不过,我得到以下错误:Jython中的PyCrypto导入问题

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

在此先感谢任何可以提供任何帮助的人。

回答

0

我不知道这适用于您的情况,但一些谷歌上搜索导致了这一点:

(从http://wiki.python.org/jython/JythonFaq/InstallingJython

Jython cannot find your Java class, even though it exists in the class path. This shows up as "ImportError: cannot import name xxx" or "AttributeError: java package xxx' has no attribute 'yyy'"

This happens when Jython is installed as a Java extension (i.e. when jython.jar is installed in java\jre\lib\ext) and your classes are installed in the classpath.

The reason is Java extensions can only see other extensions, not other classes defined in the CLASSPATH or passed in to java using the --classpath option.

There are two ways to fix this:

1) Move your classes to the java\jre\lib\ext directory.

2) Remove jython.jar from the java\jre\lib\ext directory and put jython.jar in the CLASSPATH or use the java --classpath option.

(from the Jython-users mailing list)

而另一个类似的问题,但不同尽管如此:

(从http://bugs.jython.org/issue1878866

I have a similar problem in Linux with jython 2.5. Inside jython2.5.0/Lib/site-packages a have a foo directory where there is a Java class (Bar.class) and a jython class (BarPy.py). i have also put an empty __init__.py file. In the jython interpreter environment I can always import Bar like this: "from foo import Bar" however I cannot import BarPy. If I delete the java class from the directory then I can import the jython script

+0

有趣的是,我没有将jython安装为java扩展,不过我刚刚生成了独立的lib jar并将其添加到项目 – Arg 2010-06-11 08:38:46

4

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

+0

hmm但其他C扩展似乎工作正常。此外,它能够调用模块本身,只是不会调用功能 – Arg 2010-06-11 08:40:01

+0

什么扩展名?也许ARC4是扩展,Crypto.Cipher只是纯Python中的Python包装器。 – Tarantula 2010-06-11 17:23:45