3

Instead of using Jython, is there any way to call a Java program from Python?

This Java program contains some function and I need to give an input file to Java code and it returns two values which I will be using in Python. So the Python program passes a filename to the Java code and the Java code will return two values for each line in that file.

For example I have the following file containg data like given below:

22      16050408        2       2184    T:0.938645      C:0.0613553
22      16050612        2       2184    C:0.915751      G:0.0842491
22      16050678        2       2184    C:0.94826       T:0.0517399
22      16050984        2       2184    C:0.997711      G:0.00228938
22      16051107        2       2184    C:0.94185       A:0.0581502

I need give a file to the Java program and it will return two values for each line of that file. So the number of lines in the file containg the above data, input to java code will be the same. I need to replace the column two with two columns.. i.e. the values returned by Java.

Please kindly help

4

2 に答える 2

2

コマンドラインツールとしていつでもJavaプログラムを呼び出すことができます。その場合、プログラムがどの言語であるかは実際には重要ではありません。そのためには、サブプロセスモジュールを使用することをお勧めします。ファイルシステム上の一時ファイルを使用せずに、入力/出力をPythonプログラムにパイプすることもできます。次の例では、Javaアプリを実行し、その出力を取得します。

prog = subprocess.Popen(["/usr/bin/java", "TestClass"], stdout=subprocess.PIPE)
print prog.stdout.read() 

別のオプションですが、より複雑なのはpy4jの使用です。

Py4Jを使用すると、Pythonインタープリターで実行されているPythonプログラムが、Java仮想マシンのJavaオブジェクトに動的にアクセスできます。メソッドは、JavaオブジェクトがPythonインタープリターにあるかのように呼び出され、Javaコレクションには標準のPythonコレクションメソッドを介してアクセスできます。Py4Jを使用すると、JavaプログラムでPythonオブジェクトをコールバックすることもできます。Py4JはBSDライセンスの下で配布されています。

これはあなたがしていることのように聞こえると思います。

Py4Jの利点は、JavaとPythonプログラム間で通信するためにソケットを使用するよりポータブルなソリューションであるということです。Python環境内でJVMを実行しておらず、py4jゲートウェイを実行している既存のJVMインスタンスと文字通り「通信」します。

于 2012-10-30T12:17:24.477 に答える
1

JPypeを試すことができます。

ドキュメントからの使用法の引用は次のとおりです。

from jpype import * 
startJVM("d:/tools/j2sdk/jre/bin/client/jvm.dll", "-ea") 
java.lang.System.out.println("hello world") 
shutdownJVM() 

これにより、Javaコードを実行できる専用のJVMが起動し、Pythonから透過的に呼び出します。

あなたの場合、あなたは本当にあなたのルーチンをサブプロセスとして実行することができると私は信じていますが、将来必要になった場合にJavaから他のものに簡単に切り替えることができるという利点もあります。

于 2012-10-30T12:17:37.187 に答える