2012-03-01 6 views
0

これは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で正常に動作していたようです。たぶん私は "インポート*"を使用すると、ラッパーを作成するために最初に失敗している?

(私はパフォーマンス上の理由の明示的なインポートを持つ必要があります知っているが、このソフトウェアは他の人のスクリプトを実行しますので、私はそれがその間に動作させるためにしようとしている。)

+2

「私はパフォーマンス上の理由の明示的な輸入品を持っている必要があります知っている」 - それは間違っているのです。ワイルドカードのインポートを取り除いてもパフォーマンスは向上しません。コードを分かりやすくするだけです。 – adarshr

+0

「Jython essentials」(81ページ)の著者は、Jythonがインポートしたパッケージのすべてのクラスのラッパーを作成し、それらを現在のスコープとパッケージの名前空間の両方にバインドすることを記述しています。ただし、クラスは実際に遅延的にロードされます。 – Brian

+0

Jythonの観点からは悪いかもしれませんが、Javaの立場からは間違いありません:) – adarshr

答えて

関連する問題