2012-02-19 9 views
2

가능한 중복 : 기본적으로
Calling Java app with “subprocess” from Python and reading the Java app output상호 작용

I는 무엇을 찾고, 나는 그것의 실행 그래서 내가 할 수있는 파이썬을 사용하는 동안 자바 프로그램과 상호 작용하려면 출력에 액세스하여 입력을 전달합니다. 저는 파이썬을 사용하여 Java 프로그램을 실행했습니다. 내 파이썬 프로그램에서 java 프로그램의 출력에 액세스 할 수 있는지 알고 싶습니다. 예를 들면. 자바 프로그램에서 : System.out.println ("Enter no."); 파이썬 프로그램 :

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) 

자바 파이썬에서 내가 얻을 나는 어떤까지 할 관리 어떤

python.a

에서 자바 프로그램으로 값을 전달도 문자열로와 "더를 입력하지"할 수 있어야한다 프로그램 :

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);  

     } 
} 

고맙습니다 :) 당신이 필요로하는 모든 자바 음식물의 비 대화식 실행의 출력을 얻을 경우

+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

램, subprocess.call 대신 subprocess.check_output을 사용하십시오.

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

당신은 사용할 수 check_output 파이썬 2.7 이상이 필요합니다.

Java 프로그램과 상호 작용해야하는 경우 Popen.communicate를 사용하면 프로세스 출력을 읽고 파일 설명자를 사용하여 입력 내용을 보낼 수 있습니다.

또한 pexpect python 라이브러리를 사용하여 이러한 유형의 상호 작용을 자동화 할 수 있습니다. pexpect는 Popen.communicate 사용과 관련한 다양한 작업을 추상화합니다.

이러한 기술은 자바뿐만 아니라 Python 프로그램이 필요로하는 모든 종류의 실행 파일에 적용됩니다. stdin 및 stdout을 사용하는 한이 호출을 사용하면 효과가 있습니다.

+0

고맙습니다. :) pexpect하려고하고 정말 좋아했습니다. 그냥 좋은 자습서를 찾으려고. – rockvilla

1

가장 쉬운 방법은 Jython을 사용하는 것입니다. Jython은 Jython에서 실행되는 완전한 Python 구현이며 원시 Java 코드와 상호 작용할 수 있습니다. 그러나 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

고맙습니다. 그런 빠른 답장 :) 귀하의 조언을 시도하고 진행에 대한 게시됩니다 :) – rockvilla