13

注:私は解決策を見つけて自分で答えました。しかし、なぜその設定が間違っていて問題を引き起こしたのか私にはわかりません。Jythonのインポートシステムがどのように機能するかについて、私はまだ良い説明をしたいと思っています。誰かが賞金を手に入れたいと思ったら、それに答えてください。


Pythonで計算を行う必要がある既存のJavaEEプロジェクトに取り組んでいます。私は統合テストの初期段階にありますが、すでに問題に直面しています。Jythonの本の第10章を読みましたが、それでも解決策が見つかりません。第8章(コード再利用のためのモジュールとパッケージ)も読みましたが、私にはわかりません。

Jythonインポートシステムがどのように機能し、どのように構成するかについての説明をいただければ幸いです。

問題:

$ jython -v
import: 'exceptions' as org.python.core.exceptions in builtin modules
Jython 2.5.3 (2.5:c56500f08d34+, Aug 13 2012, 14:54:35) 
[Java HotSpot(TM) Server VM (Oracle Corporation)] on java1.7.0_10
import: import site # precompiled from /home/me/jython/2.5.3/Lib/site$py.class
import: 'sys' as sys in builtin modules
import: import os # precompiled from /home/me/jython/2.5.3/Lib/os$py.class
import: 'errno' as org.python.modules.errno in builtin modules
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules
import: import posixpath # precompiled from /home/me/jython/2.5.3/Lib/posixpath$py.class
import: import stat # precompiled from /home/me/jython/2.5.3/Lib/stat$py.class
import: 'java' as java package
import: 'File' as java class
import: 'IOException' as java class
import: 'org' as java package
import: 'Py' as java class
Type "help", "copyright", "credits" or "license" for more information.

>>> import pendulum.generator.BuildingType
import: import pendulum # precompiled from /path/to/project/build/classes/pendulum/__init__$py.class
import: import pendulum.generator # precompiled from /path/to/project/build/classes/pendulum/generator/__init__$py.class
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named BuildingType

私の質問は、何が間違っているのか、BuildingTypeインターフェイスを正常にインポートするために修正するにはどうすればよいですか?問題はCLASSPATHにあるかもしれませんが、どの値が適切であるかわかりません。


コード編成:

$ tree build/classes/pendulum/generator/ src/pendulum/generator/
build/classes/pendulum/generator/
├── BuildingType.class
├── __init__.py
└── __init__$py.class

src/pendulum/generator/
├── BuildingType.java
└── __init__.py

プライベートJythonレジストリファイルによって定義されたインポートパス:

$ cat ~/.jython 
python.path=\
/path/to/project/build/classes:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages

sys.pathJythonプロンプトでチェックしたので、Jythonがパスを取得すると確信しています。

BuildingType.java

package pendulum.generator;

public interface BuildingType {
    public String getBuildingName();
    public String getBuildingAddress();
    public String getBuildingId();
}
4

2 に答える 2

4

トライ/キャッチアプローチで多くの時間を無駄にした後、私は自分で答えを見つけることができました。

.jython次のようになります。

python.path=\
/path/to/project/build:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages

これではない:

python.path=\
/path/to/project/build/classes:\
/path/to/project/src:\
/home/me/jdevel/extras/2.5.3/Lib:\
/home/me/jdevel/extras/2.5.3/Lib/site-packages

特に、インポートパスへの追加/path/to/project/build/classesは(ファイルシステム階層を反映している場合でも)間違っています/path/to/project/buildが、問題は正しく解決されています。

于 2013-02-19T14:04:06.907 に答える
4

python.pathだけでなくCLASSPATHも設定する必要があります。

同じディレクトリレイアウトで、これは私にとってはうまくいきます:

jython10$ CLASSPATH=build/classes/  jython -v Building.py
import: 'exceptions' as org.python.core.exceptions in builtin modules
import: import site # precompiled from /usr/local/Java/jython2.5.3/Lib/site$py.class
import: 'sys' as sys in builtin modules
import: import os # precompiled from /usr/local/Java/jython2.5.3/Lib/os$py.class
import: 'errno' as org.python.modules.errno in builtin modules
import: 'posix' as org.python.modules.posix.PosixModule in builtin modules
import: import posixpath # precompiled from /usr/local/Java/jython2.5.3/Lib/posixpath$py.class
import: import stat # precompiled from /usr/local/Java/jython2.5.3/Lib/stat$py.class
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum'
import: 'pendulum' as java package
import: 'pendulum' as java package
import: java package as '/Users/sdm7g/jaxp/jython10/build/classes/pendulum/generator'
import: 'pendulum.generator' as java package
import: 'BuildingType' as java class

参照:CLASSPATH(Jython Book)の操作。

于 2013-02-15T20:20:41.203 に答える