web-dev-qa-db-ja.com

Java Python統合

Javaサードパーティのライブラリと統合する必要のあるアプリがあります。このライブラリはPythonで書かれているので、それについては何も言いません。 JEPP(Java Embedded Python)を試していますが、以前にそれを使用したことがありますか?他の考えは、JNIを使​​用してPythonのCバインディングと通信することです。

これを行うための最良の方法に関するご意見をいただければ幸いです。ありがとう。

49
Jeff Storey

Jython を使用しないのはなぜですか?すぐに考えられる唯一の欠点は、ライブラリがCPythonネイティブ拡張を使用している場合です。

編集:Jythonnowを使用できるが、それ以降のバージョンのライブラリに問題があると思われる場合は、ライブラリをライブラリから分離することをお勧めしますアプリ(たとえば、ある種のアダプターインターフェイス)。現時点で動作する最も単純なものを使用し、必要に応じてJNI/CPython/etcを検討してください。本当に必要な場合を除き、(痛みを伴う)JNIルートに行くことで得られるものはほとんどありません。

37
Jon Skeet

率直に言って何らかの形でPython JVM内から直接実行するほとんどの方法は機能しません。互換性(サードパーティライブラリの新しいリリースはpython 2.6機能を使用でき、Jython 2.5では動作しません)またはハック(実際には解決に至らない暗号のJVMスタックトレースで破損します)。

この2つを統合するための好ましい方法は、RPCを使用することです。 XML RPC は、中程度の量のデータがある場合、ここでは悪い選択ではありません。これはかなりよくサポートされています— Pythonは標準ライブラリに含まれています。Javaライブラリも簡単に見つかります。セットアップに応じてJavaまたはPython一部は、他の言語からの接続を受け入れるサーバーになります。

あまり一般的ではありませんが、RPCを実行する代替方法を検討する価値があるのは、 Nice rpc の2/3をサポートするGoogle protobufferです。トランスポート層を提供するだけです。それほど多くの作業と書き込みの利便性は合理的ではありません。

別のオプションは、Python機能にJavaを公開し、JVMネイティブプラグイン経由で使用する必要がある機能の一部をCラッパーで記述することです。 SWIG [〜#〜] swig [〜#〜] を使用することによる痛み。

基本的にあなたの場合、それはそのように動作します:

  1. JavaからC++へのすべてのメソッド呼び出し用にSWIGインターフェースを作成します。
  2. 呼び出しを受信し、適切なパラメーターを使用してpythonインタープリターを内部的に呼び出すC/C++コードを作成します。
  3. pythonから取得した応答を変換し、swigを介してJavaコードに送り返します。

このソリューションはかなり複雑で、ほとんどの場合、少しやり過ぎです。それでも(何らかの理由で)RPCを購入できない場合は、やりがいがあります。とはいえ、RPCは依然として私の好みの選択肢です。

19
Marcin

何年も後に、最近人気のあるオプションを追加するだけです...

CPythonの機能が必要な場合は、 py4j が適切なオプションです。 py4jで頻繁に更新を見ています 2016年2017年 2018年に使用されたため、ある程度の人気を得ています。 Apache Sparkを達成するために CPythonの相互運用性

13
bluenote10

私の他の考えは、JNIを使​​用してPythonのCバインディングと通信することです。

私はとても好きです [〜#〜] jna [〜#〜]

JNAは、Javaプログラムがネイティブ共有ライブラリ(Windows上のDLL)に簡単にアクセスできることを提供します。ただし、Javaコード-JNIまたはネイティブコードは不要です。 WindowsのPlatform/InvokeとPythonのctypesに匹敵し、アクセスは実行時にコード生成なしで動的です。

私の0.02 $ :)

7
dfa

ActiveMQ のようなメッセージングサービスを使用できます。 Python とJavaの両方のサポートがあります。このように、複雑なJNIまたはCバインディングをそのままにして、単純なインターフェースと考えるものだけを処理できます。さらに、ライブラリが更新されたときに、何かを変更する必要はほとんどありません。

5
geowa4

Java VMで Jython を実行することを検討しましたか?

4
cletus

JNIで同様のセットアップを調査しました。たぶん、まだ見ていなければこれが役立つでしょう:

http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python

http://jpe.sourceforge.net/

4
Ralphleon

PythonコードをJythonで動作させることができれば、それを使用してJavaから呼び出すことができるはずです。

3
ars