如何使用python执行java程序,同时考虑输入和输出

时间:2012-02-17 18:42:34

标签: java python subprocess

将我的python程序视为input.py

import os.path,subprocess
from subprocess import STDOUT,PIPE

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]
proc = subprocess.Popen(cmd,stdout=PIPE,stderr=STDOUT)
input=subprocess.Popen(cmd,stdin=PIPE)
print proc.stdout.read()

我使用的Java文件是Hi.java

import java.util.*;
class Hi
{
       public static void main(String args[])
       {
            Scanner t=new Scanner(System.in);
            System.out.println("Enter any string");
            String str=t.nextLine();
            System.out.println("This is "+str);
            int a=5;
            System.out.println(a);
       }
}

当我调用input.execute_java(Hi.hava)时,输出为"Enter the string",当我输入字符串"Jon"时,然后再输出“输入字符串这是Jon”即输出提供整个输出两次。可能是由于代码input=subprocess.Popen(cmd,stdin=PIPE)导致的一个输出和由于代码print proc.stdout.read()导致的第二个输出 我希望它只打印一次。我该怎么办?我希望我的python变量接收java程序的所有输出,并使用该变量我将在屏幕上显示输出。此外,如果有一个java程序的输入,我希望该用户输入将存储在我的python变量中的输入,并使用此变量,我想将输入传递给java程序。我该怎么办?

1 个答案:

答案 0 :(得分:7)

您应该使用communicate代替stdout.readcommunicate的参数是子进程的输入。另外,当您实际上不希望shell执行命令时,传递shell=True是个坏主意。相反,将参数作为列表传递:

import os.path,subprocess
from subprocess import STDOUT,PIPE

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

def execute_java(java_file, stdin):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', java_class]
    proc = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout,stderr = proc.communicate(stdin)
    print ('This was "' + stdout + '"')

compile_java('Hi.java')
execute_java('Hi.java', 'Jon')