2012-02-19 6 views
2

可能性の重複使用:私は探していますどのような基本的
Calling Java app with “subprocess” from Python and reading the Java app outputインターアクト・パイソン

をされ、私は私ができるように、その実行のpythonを使用しながら、Javaプログラムと対話したいです出力にアクセスして入力を渡します。 私はPythonを使用してJavaプログラムを実行することができました。私は私のpythonプログラムでJavaプログラムの出力にアクセスできることを知りたいです。 たとえば、 Javaプログラムの場合:System.out.println( "Enter no。"); Pythonプログラム:

import sys 
import os.path,subprocess 

def compile_java(java_file): 
    subprocess.check_call(['javac', java_file]) 

def execute_java(java_file): 
    java_class,ext = os.path.splitext(java_file) 
    cmd = ['java', java_class] 
    subprocess.call(cmd, shell=False)    

def run_java(java_file): 
    compile_java(java_file) 
    execute_java(java_file) 

Javaの私は文字列としてもpython.aノーまで行うことに成功し何

からJavaプログラムに値を渡す「noを入力し、」得ることができる必要がありますPythonで プログラム:

import java.io.*; 
import java.util.*; 
class Hi 
{ 
     public static void main(String args[])throws IOException 
     { 
     Scanner t=new Scanner(System.in); 

     System.out.println("Enter any integer"); 
     int str1=t.nextInt();   
     System.out.println("You entered"+str1);  

     } 
} 

ありがとう:)あなたが必要とするすべてはあなたのJavaプログレの非対話型の実行からの出力を得ることである場合

+0

入力をプログラムに渡す場合は、おそらく 'subprocess.Popen'を使用する必要があります。 – Amber

+1

参照:http://stackoverflow.com/questions/2388423/calling-java-app-with-subprocess-from-python-and-reading-the-java-app-output – BeRecursive

答えて

1

ramでは、subprocess.callの代わりにsubprocess.check_outputを使用します。

http://docs.python.org/library/subprocess.html

あなたは利用できるようにするcheck_outputのためのPython 2.7以降が必要です。

Javaプログラムと対話する必要がある場合は、Popen.communicateを使用します.Popen.communicateでは、プロセスの出力を読み込み、ファイルディスクリプタを使用して入力内容を送信できます。

pexpectのpythonライブラリを使用して、この種のやりとりを自動化することもできます.pexpectは、Popen.communicateを使用する際に必要な多くの作業を抽象化します。

これらの手法は、Javaだけでなく、Pythonプログラムと対話するために必要なあらゆる種類の実行可能ファイルに適用されることに注意してください。 stdinとstdoutを使用している限り、これらの呼び出しを使用すると効果的です。

+0

クイック返信のためのThanx :)私は与えましたpexpectしようとすると、本当にそれが好きだった。ちょうど良いチュートリアルを見つけようとしています。 – rockvilla

1

最も簡単な方法は、Jythonを使用することです.Jythonは、JVMで実行され、ネイティブJavaコードとやりとりできる完全なPython実装です。しかし、CPythonを使い、上でスケッチしたパスを一般的に続けたい場合は、対話できるPython Popenオブジェクトを作成したいと思うでしょう。例:

import sys 
import os.path,subprocess 

def compile_java(java_file): 
    subprocess.check_call(['javac', java_file]) 

def execute_java(java_file): 
    java_class,ext = os.path.splitext(java_file) 
    cmd = ['java', java_class] 
    return subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

def run_java(java_file): 
    compile_java(java_file) 
    process = execute_java(java_file) 
    for i in range(10): 
     process.stdin.write(str(i) + "\n") 
+0

このようなクイック返信のためのThanx :)私はあなたのアドバイスを試みており、進捗状況について投稿します:) – rockvilla