2009-07-13 17 views
40

私はサードパーティのライブラリと統合する必要があるJavaアプリケーションを持っています。ライブラリはPythonで書かれており、私はそれ以上のことは言いません。私はそれを統合する最良の方法を見つけようとしています。私はJEPP(Java Embedded Python)を試しています - これまで誰でも使っていますか?私の他の考えは、JNIを使​​ってPythonのCバインディングと通信することです。Java Pythonの統合

これを行う最善の方法について考えていただければ幸いです。ありがとう。

+1

Pythonライブラリがすべて純粋なPythonで書かれている場合、Jythonを使うのはどうですか? – fabrizioM

答えて

28

なぜ使用しないのですかJython?私がすぐに考えることができる唯一の欠点は、あなたのライブラリがCPythonネイティブエクステンションを使用している場合です。

編集:Jython nowを使用できますが、それ以降のバージョンのライブラリで問題が発生する可能性がある場合は、アプリからライブラリを分離することをおすすめします(アダプタインターフェイスなど)。今のところ一番簡単なことをして、必要なときにJNI/CPython/etcを検討してください。あなたが本当にしなければ(痛い)JNIルートに行くことで得られることはほとんどありません。あなたはJythonの中で動作するようにあなたのPythonコードを得ることができるなら、あなたは、Javaからそれを呼び出すためにそれを使用することができるはず

+0

私はJythonライブラリを見てきました。問題は、使用しているライブラリでネイティブ拡張を使用しない(または将来使用しない)という保証がないことです。 –

+0

私はそれをします。ありがとう。 Jythonでpyファイルを実行するために特別なものを追加する必要がありますか?または、それがネイティブのPythonなら、それはちょうど実行する必要がありますか? –

+0

私はJythonに関する多くの経験がありません - ドキュメントを参照してください:) –

4

Java VMでJythonを実行したことがありますか?

+0

IronPythonはJava用ではなく.NET用です。 IKVMは3つの潜在的に、しかしickを結びつけることができます:) –

+0

はい、私のワイヤーを越えました。 – cletus

+1

IronPythonへの参照が他の場所で見逃されましたか? –

4

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

13

フランキーどういうわけか、JVM内からPythonを直接実行するには、が動作しません。それらは互換性がありません(サードパーティ製ライブラリの新しいリリースではPython 2.6の機能を使用でき、Jython 2.5では動作しません)、またはハッキー(潜在的な解決策には至っていない隠されたJVMスタックトレースで破損します)。

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

あまり一般的ではありませんが、RPCを行う代替方法を考える価値は、nice rpcの2/3のGoogleプロトパックです。あなたはトランスポート層を提供するだけです。それほど多くの仕事や執筆の利便性は合理的ではありません。

もう1つの選択肢は、Javaに公開してJVMのネイティブプラグインを介して使用する必要があるPython機能の部分をCラッパーで記述することです。あなたはSWIG SWIGに行くことで痛みを緩和することができます。

は基本的に、あなたのケースでは、そのように動作します:

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

このソリューションはかなり複雑で、ほとんどの場合過剰です。あなたが(何らかの理由で)RPCを買う余裕がない場合でも、それは価値があります。 RPCは私の好みの選択肢です。

+5

この非JVMとの互換性は、Pythonの最大の欠点です。 Scalaの使用を決めた理由それはさらに良いです。 – Jus12

+0

Marcinは、パフォーマンスとスケーラビリティの理由から、大規模なデータ実装(アルゴリズムまたはアプリケーション)ではリモートコールの方法が望ましくありません。確かに「非互換性」は問題ですが、「潜在的なJVMスタックトレースを破る」にはいくつかの説明と例が必要です。あなたはデバッグするのが難しいか、実行しないのですか? JNIを途中でやっていて、最高のもののように思えるJepを試しています。 https://github.com/mrj0/jep/wiki/How-Jep-Works。思考? – SemanticBeeng

7

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

私はJNAとても気に入っ:

JNAは、Javaコード-noがJNIまたはネイティブコードは必要ありませんが、何も記述せずにJavaプログラムにネイティブ共有ライブラリ(Windows上のDLL)への容易なアクセスを提供します。この機能はWindowsのPlatform/InvokeとPythonのctypesに匹敵します。アクセスはコード生成なしで実行時に動的です。

私の0.02 $ :)

4

多くの年後に、ちょうどこの頃より人気のあるオプションを追加するには...

あなたはCPythonの機能が必要な場合は、py4jは良いオプションです。 py4jは、2017の頻繁な更新を見ており、いくつかの人気を得ています。 Apache SparkによってCPython interoperabilityを達成する。

+1

これはJythonよりもはるかに優れたオプションです。これは技術的なデッドエンドであり、もはや維持されていないようです。 –

関連する問題