web-dev-qa-db-ja.com

Javaライブラリからpython

pythonアプリとJavaアプリがあります。pythonアプリはJavaアプリを実行し、コマンドラインから呼び出します。

これにはもっとエレガントな解決策があるに違いない。 JNIを使​​用してJavaからCコードを呼び出すのと同じです。

ポインタはありますか? (FYI私はPythonが初めてです)

明確化(長い質問を犠牲にして:謝罪)pyアプリ(私が所有していません)は、多数の構成ファイルの形式でユーザー入力を受け取ります。次に、これらを解釈し、ファームはプラグインメカニズムを介していくつかの(非表示の)ツールを処理します。レガシーJavaアプリによって提供される機能のサポートを追加したいと考えています。

したがって、python app from the Java appから呼び出すことは意味がなく、pyアプリをjython環境で実行できません( JVM)。

これには明確なメカニズムがないため、単純なCL呼び出しが最善の解決策であると思います。

31
Jim

スレッドを再確認して申し訳ありませんが、受け入れられた答えがありませんでした...

Py4J を使用することもできます。フロントページと多くのドキュメントに例がありますが、基本的には、Javaメソッドからpythonコードをあたかもpythonメソッド:

>>> from py4j.Java_gateway import JavaGateway
>>> gateway = JavaGateway()                        # connect to the JVM
>>> Java_object = gateway.jvm.mypackage.MyClass()  # invoke constructor
>>> other_object = Java_object.doThat()
>>> other_object.doThis(1,'abc')
>>> gateway.jvm.Java.lang.System.out.println('Hello World!') # call a static method

Jythonとは対照的に、Py4JはPython VMで実行されるため、常に最新バージョンのPythonまた、Jythonで適切に動作しないライブラリ(lxmlなど)を使用できます。通信は、JNIではなくソケットを介して行われます。

免責事項:私はPy4Jの作成者です

58
Barthelemy

Jython を見てください。これはJNIのようなものですが、CをPythonで置き換えます。つまり、Python from Javaから、またはその逆を呼び出すことができます。するか、現在のアプローチがあなたの望むものではない理由。

8
Dave Ray

コンテナ(サーブレット/ EJB)でJavaコードをラップします。

したがって、vm-startupで時間を失うことなく、よりサービス指向の方法に進むことができます。

ラッピングにはjythonを使用できます(pythonに精通している場合のみ意味があります

pythonおよびJavaが使用できる通信プロトコルを選択します。

  • json(www.json.orgを参照)
  • rmi(Python:JPype)
  • REST
  • SOAP(勇敢な場合のみ)

あなたやあなたのパートナーが親しんでいるものを選んでください!

5
Blauohr

JavaアプリをPythonプロセス内に埋め込む場合は、 JPype を参照してください。これにより、 Java JNI経由。

5

Swigの使用はどうですか: http://www.swig.org/Doc1.3/Java.html

4
user59634

JCCを試してみてください http://pypi.python.org/pypi/JCC/2.1

JCCは、JavaをCPythonから直接呼び出すためのコードジェネレーターです。CPython2.3以降、いくつかのJRE(Sun JDK 1.4以降、Apple JRE 1.4以降、 OS X、Linux、Solaris、およびWindows上のOpenJDK 1.7)。これは、Open Source Application Foundation(OSAF、Chandlerを作っている人々)によって作成され、Apacheスタイルのライセンスの下でリリースされています。

パッケージの説明から:

JCCは、Javaのネイティブ呼び出しインターフェイス(JNI)を介してCPythonからJavaクラスを呼び出すために必要なグルーコードを生成するためのC++コードジェネレーターです。

JCCは、JNIアクセスのすべての残酷な詳細を隠すC++ラッパークラスを生成しますJavaメモリおよびオブジェクト参照管理。

JCCは、PythonインタープリターからこれらのC++クラスにアクセスできるようにするCPythonタイプを生成します。JCCは、イテレーターおよびプロパティアクセサーを検出することにより、これらのPythonタイプをPythonicにしようとします。イテレーターおよびマッピングはJCCにも宣言できます。

2
sstock