[英]How to execute java program using python considering inputs and outputs both
將我的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.read
。 communicate
的論點是子流程的輸入。 此外,當您實際上不希望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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.