web-dev-qa-db-ja.com

Python内からJava

可能性のある複製:
Java Python統合

私は100%Javaで書かれた大きな既存のコードベースを持っていますが、その新しいセクションにPythonを使用したいと思います。テキストと言語処理を行う必要があります。むしろPython=と [〜#〜] nltk [〜#〜] のようなライブラリを使用してこれを行います。

私はJythonプロジェクトを知っていますが、これはJavaとそのライブラリをPython内から使用する方法を表しているように見えますが、他の方法ではなく、これについて間違っていますか?

そうでない場合、JavaとPythonの間のインターフェースに最適なメソッドは何でしょうか。つまり、(理想的には)Pythonでメソッドを呼び出して、 Javaに戻りましたか?

ありがとうございました。

57
Liam

私はJythonプロジェクトを知っていますが、これはJavaとそのライブラリをPython内から使用する方法を表しているように見えますが、他の方法ではなく、これについて間違っていますか?

はい、あなたは間違っています。 コマンドラインインタープリターを呼び出す を実行してpython Jytonを使用したコード)または se python Javaのコード 。過去にはpython-to-Javaコンパイラもありましたが、Jython 2.2で廃止されました

35

テキストと言語の処理を処理するPythonモジュールを作成し、Javaプログラムとやり取りできるjythonに小さなブリッジを作成します。 jythonブリッジは非常に単純なもので、呼び出しはpythonモジュールへの転送のみを担当し、pythonモジュールからJavaへの応答を返します。 _モジュール。 Jythonは非常に使いやすく、セットアップに15分以上かかることはありません。

幸運を祈ります!

6
Mia Clarke

JVMに移植されていないNumpyに依存しているため、JythonのNLTKを使用できるとは思いません。 NLTKまたは他のネイティブCPython拡張機能が必要な場合は、CPythonとJVMの間で通信するためにIPCメカニズムを使用することを検討してください。 Jeppと呼ばれる:

http://jepp.sourceforge.net/

逆(Javaコードを呼び出す)は、JPypeとjavaclassの目標です。

sourceforge.net/projects/jpype/

pypi.python.org/pypi/javaclass/0.1

私はこれらのプロジェクトを使用したことがないので、その品質を誓うことはできません。

4
Carlos Santos

Jythonは、JVM上で実行されるPython実装です。埋め込みに関する情報は、Python既存のJava app ユーザーガイド

あなたが働いている環境はわかりませんが、同じアプリ内で言語を混在させるとすぐに混乱につながる可能性があることに注意してください。 Javaコードをラップする別個にパッケージ化された実装クラスとともに、使用する予定の操作を表すPythonインターフェイスを作成することをお勧めします。

2
kdgregory

私の意見では、Jythonはまさにあなたが見ているものです。
これはの実装ですPython JVM内;そのため、オブジェクトを自由に交換できますそして、例えば、Javaクラスから継承します(いくつかの制限付き)。

C(またはその他のコンパイルされた言語)で記述されたすべての(C)Python拡張を使用できないため、その主要な長所(JVMの上にある)も大きな欠点であることに注意してください。これは、テキスト処理で実行する意思に影響を与える可能性があります。

Jythonとは何か、その可能性と制限についての詳細は、 Jython FAQ を読むことをお勧めします。

2
rob

Java内からサブプロセスとしてPythonインタープリターを実行するだけです。

Python機能を適切なスクリプトとして記述します。これは、stdinから読み取り、stdoutに書き込みます。

Java Runtimeクラスを使用して、Pythonスクリプトを実行するサブプロセスを生成します。これは非常に簡単で、非常にクリーンなインターフェースを提供します。 。


編集

import simplejson
import sys
for request in sys.stdin.readlines():
    args = simplejson.loads( request )
    result = myFunction( args['this'], args['that'] )
    sys.stdout.writeline( simplejson.dumps( result ) + "\n" )

インターフェイスはシンプルで構造化されており、オーバーヘッドが非常に低くなっています。

0
S.Lott

PythonとJava=これから両方を知っている開発者がコードベースで必要であることを確認して、開発にお金を払っている人たちからまず確認してください。間違いなく既に説明した他のコストと保守性の影響。

参照: http://www.acm.org/about/se-code 1.06、2.03、2.09、4.03、4.05、6.07

0
Mikael Gueck