【问题标题】:How to execute java program using python considering inputs and outputs both如何使用python执行java程序同时考虑输入和输出
【发布时间】:2012-03-09 04:05:57
【问题描述】:

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

【问题讨论】:

    标签: java python subprocess


    【解决方案1】:

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

    【讨论】:

    • 感谢您的解决方案.. 但我不想将字符串作为参数传递给 java 程序,即 execute_java('Hi.java', 'Jon') 也不想将参数作为标准输出传递,stderr = proc.communicate("Jon").我希望java程序在询问我输入后应该等待。当我输入输入时,它必须继续执行。请帮助..
    • 嗯,parameter-to-communicate 变体就是这样做的——它将"Jon" 写入Java 程序的标准输入通道,并等待Java 程序执行。如果您想以交互方式处理程序(即根据 Java 程序的输出发送多个输入),您可以使用 proc.stdinproc.stdout。如果是这种情况,请提出一个新问题。这个答案中的Python程序通过什么方式解决了你的问题?
    • 我使用了 proc.stdin 和 proc.stdout,因此我的 python 程序是.. 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() 但由于这个原因,输出是“输入任何字符串”,当我输入任何字符串时说“乔恩”,然后它再次打印为“输入任何字符串这是乔恩”..即它打印输出两次。
    • 好吧,你执行了两次程序,没有任何理由。删除input = subprocess.Popen(cmd,stdin=PIPE) 行。
    • 如果我删除行 input = subprocess.Popen(cmd,stdin=PIPE) ,它只是为我提供了 javaprogram 的所有输出。它从不执行 java 程序的任何输入。如果我将 stdin=PIPE 作为参数传递给 proc=subprocess.Popen 上面的语句,那么它甚至没有给出 java 的任何输出..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多