簡體   English   中英

如何使用python執行java程序,同時考慮輸入和輸出

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM