これはjythonのバグか、jython 2.5.2でjavaパッケージ/クラスをインポートする際のいくつかのニュアンスについて誤解されているかどうかはわかりません。「from javax.mail import *」を使用しているときに、jythonでpublic javaオブジェクトを解決できないのはなぜですか?
私はjavaからjythonスクリプトを実行するjythonクラスを持っています。これらのスクリプトの1つがメールを送信するだけです。 Jythonスクリプトコードの
スニペット:
from javax.mail import *
from javax.mail.internet import *
from java.util import Properties
props = Properties()
props.put("mail.smtp.host", "path.mydomain.com")
session = Session.getInstance(props,None) # Session can't be resolved
だから私はのjavax.mail.Sessionであるセッションを、解決しようとすると例外で終わる、と「からのjavax.mailによってカバーされるべきですインポート*声明」
のJythonを実行するJavaクラスは、ビットのようになります。
static {
PythonInterpreter.initialize(System.getProperties(), new Properties(), new String[0]);
}
void run(String scriptPath){
String script;
// script is read into this string here from path
PythonInterpreter python = new PythonInterpreter(null, new PySystemState());
try (
python.exec(script);
) catch (PyException pyEx){
// catch
}
}
奇妙なことは、私は明示的なIMPで別のJythonスクリプトを実行している場合でありますorts、like
from javax.mail import Session
これでうまくいきますが、以前のスクリプトからセッションを解決できるようになります。
私は、org.pythonのjython-standaloneをMavenリポジトリのバージョン2.5.2で使用しています。このコードは2.1で正常に動作していたようです。たぶん私は "インポート*"を使用すると、ラッパーを作成するために最初に失敗している?
(私はパフォーマンス上の理由の明示的なインポートを持つ必要があります知っているが、このソフトウェアは他の人のスクリプトを実行しますので、私はそれがその間に動作させるためにしようとしている。)
「私はパフォーマンス上の理由の明示的な輸入品を持っている必要があります知っている」 - それは間違っているのです。ワイルドカードのインポートを取り除いてもパフォーマンスは向上しません。コードを分かりやすくするだけです。 – adarshr
「Jython essentials」(81ページ)の著者は、Jythonがインポートしたパッケージのすべてのクラスのラッパーを作成し、それらを現在のスコープとパッケージの名前空間の両方にバインドすることを記述しています。ただし、クラスは実際に遅延的にロードされます。 – Brian
Jythonの観点からは悪いかもしれませんが、Javaの立場からは間違いありません:) – adarshr