13

Jythonを使用して、Java内からPythonのスニペットを実行しようとしています。execステートメントを使用してインポートすると、すべてが機能します。

PythonInterpreter pi = new PythonInterpreter();
pi.exec("import re");
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // returns a MatchObject
o = pi.eval("re.match('abc', 'def123')"); // returns Py.None

しかし、私が2つの線を組み合わせようとすると、すべての地獄が解き放たれます。これ:

PythonInterpreter pi = new PythonInterpreter();
pi.eval("import re"); // exception!
PythonObject o = pi.eval("re.match('abc', 'abc123')"); // never gets here
o = pi.eval("re.match('abc', 'def123')"); // ....

...例外をスローします"no viable alternative at input 'import'", ('<string>',1,0,'import re\n')

理想的には、インポートを別の部分に分割することなく、スクリプト全体を単一の文字列として評価できるようにしたいので、これは重要です。私は何か間違ったことをしていますか?Jythonに「インポートを含むこのスクリプトのブロブ全体を取得して実行し、結果を返す」ように指示する別の方法はありますか?.classこれは実行時に行う必要があります。Pythonをファイルに事前コンパイルすることはできません。

4

3 に答える 3

18

問題は、evalが を評価して結果を返すのに対し、exec はあるコンテキストでステートメントを実行することです。importはステートメントですが、re.match()は式です。

于 2012-08-09T15:17:40.987 に答える
7

これを試して、

eval("__import__('re').match('abc', 'abc123')")
于 2012-08-11T13:37:33.463 に答える
1

ここで、結果とはどういう意味ですか?

スクリプトの計算値であると想定しています。「exec」のドキュメントによると、コードは現在のスコープで実行されます。したがって、exec ステートメント内で作成した新しいシンボルの値にアクセスできる必要があります。

a = 20
b = 10
exec("c = a + b")
print c

上記のコードは 30 を出力するはずです。

于 2012-08-09T15:57:36.400 に答える