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

将我的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”,即它提供整个输出两次。 也许一个输出由于python代码input=subprocess.Popen(cmd,stdin=PIPE)和第二个输出由于代码print proc.stdout.read()我希望它只打印一次。 我该怎么办? 我希望我的python变量接收java程序的所有输出,并使用该变量我将在屏幕上显示输出。 此外,如果有一个java程序的输入,我希望该用户输入将存储在我的python变量中的输入,并使用此变量,我想将输入传递给java程序。 我该怎么办?

您应该使用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')