2012-02-19 118 views
2

可能重复:
Calling Java app with “subprocess” from Python and reading the Java app output交互与使用python java程序

基本上就是我期待的是,我想同时使用python的运行,所以我可以用java程序进行交互访问其输出并将输入传递给它。 我已经设法使用python运行Java程序。我想知道我可以在我的python程序中访问java程序的输出。例如, 。在java程序中:System.out.println(“Enter no。”); 在Python中我应该能够得到“输入no” string和也python.a

传递价值,java程序我能够做到的,直到没有: 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计划:

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 2012-02-19 19:38:49

+1

请参阅:http://stackoverflow.com/questions/2388423/calling-java-app-with-subprocess-from-python-and-reading-the-java-app-output – BeRecursive 2012-02-19 19:42:01

回答

1

如果你需要的是让您的Java PROG的非交互式运行的输出内存,使用subprocess.check_output而不是subprocess.call。

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

你需要Python 2.7版或更新版本的check_output可用。

如果您需要与Java程序进行交互,您可以使用Popen.communicate执行此操作,您可以在其中读取进程的输出并使用文件描述符将内容发送到其输入。

您也可以使用pexpect python库来自动执行这种交互,pexpect会抽象出使用Popen.communicate时涉及的大量工作。

请注意,这些技术适用于您需要Python程序进行交互的任何类型的可执行文件,而不仅仅是Java;只要它使用stdin和stdout,使用这些调用应该为你工作。

+0

Thanx的快速回复:)我给尝试着眼于并真正喜欢它。试图找到一些很好的教程。 – rockvilla 2012-02-20 12:24:42

1

最简单的方法是使用Jython,它是一个在JVM中运行的完整的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

Thanx为这样一个快速回复:)我正在尝试你的意见,并会发布有关进展:) – rockvilla 2012-02-20 12:26:45