Vir*_*ath 3 python java 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()
Run Code Online (Sandbox Code Playgroud)
我使用的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);
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用时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.read.参数communicate是子进程的输入.此外,shell=True当您实际上不希望shell执行命令时,传递是一个坏主意.相反,将参数作为列表传递:
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')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12070 次 |
| 最近记录: |