3

現在、jython 内で実行されている python bittorrent トラッカーを取得しようとしていますが、この問題が発生しました。トラッカーは、プラットフォーム用にコンパイルして python パスに追加した 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

コマンドが

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

あらゆる種類のヘルプを提供できる人に事前に感謝します。

4

2 に答える 2

4

これはおそらく、pycrypto が C 拡張であり、Jython がこの拡張用の Java ラッパーなしで呼び出すことができないためです。

于 2010-06-10T19:25:59.357 に答える
0

これがあなたの状況に当てはまるかどうかはわかりませんが、いくつかのグーグルがこれにつながりました:

( http://wiki.python.org/jython/JythonFaq/InstallingJythonから)

Java クラスがクラス パスに存在するにもかかわらず、Jython が Java クラスを見つけることができません。これは、「ImportError: cannot import name xxx」または「AttributeError: java package xxx' has no attribute 'yyy'」として表示されます。

これは、Jython が Java 拡張機能としてインストールされている場合 (つまり、jython.jar が java\jre\lib\ext にインストールされている場合)、クラスがクラスパスにインストールされている場合に発生します。

その理由は、Java 拡張機能は他の拡張機能しか認識できず、CLASSPATH で定義された他のクラスや --classpath オプションを使用して Java に渡された他のクラスは認識できないためです。

これを修正するには、次の 2 つの方法があります。

1) クラスを java\jre\lib\ext ディレクトリに移動します。

2) java\jre\lib\ext ディレクトリから jython.jar を削除し、jython.jar を CLASSPATH に入れるか、java --classpath オプションを使用します。

(Jython-users メーリング リストから)

そして、別の同様の問題ですが、それでも異なります:

( http://bugs.jython.org/issue1878866から)

Linuxでもjython 2.5で同様の問題があります。jython2.5.0/Lib/site-packages 内には、Java クラス (Bar.class) と jython クラス (BarPy.py) がある foo ディレクトリがあります。空の __init__.py ファイルも入れました。jython インタープリター環境では、「from foo import Bar」のようにいつでも Bar をインポートできますが、BarPy をインポートすることはできません。ディレクトリからJavaクラスを削除すると、jythonスクリプトをインポートできます

于 2010-06-10T19:21:48.517 に答える