使用python与java程序交互

时间:2012-02-19 19:35:38

标签: java python django linux subprocess

  

可能重复:
  Calling Java app with “subprocess” from Python and reading the Java app output

基本上我正在寻找的是,我想在使用python运行时与java程序进行交互,这样我就可以访问它的输出并将输入传递给它。 我已经设法使用python运行Java程序。我想知道我可以在我的python程序中访问java程序的输出。 例如。 在java程序中:System.out.println(“输入否。”); 在python中,我应该能够将“输入否”作为字符串,并将值从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);     

        }
}

Thanx:)

2 个答案:

答案 0 :(得分:1)

如果您只需要从Java程序的非交互式执行获取输出,请使用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,使用这些调用应该适合你。

答案 1 :(得分: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")