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

标签 java python 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()

我用的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 程序。我该怎么办?

最佳答案

你应该使用 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 - 考虑到输入和输出,如何使用 python 执行 java 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9333637/

相关文章:

Java Swing - 难以实现所需的布局

java - mysql 主机服务器未连接

python - 如何在timeit范围内更新代码?

python - Python 中 NLTK 工具包的默认分块器是什么?

python - 从子进程开始时出现 EOFError

python - 子处理管道写入文件故障

java - 需要从HIVE UDF的3列构造3个列表

python - 在截止时间后锁定操作投票,在 Django 中编辑投票实例时解锁

python - 以 nohup 启动的进程未与父进程分离

java - 虽然构造函数需要参数我仍然可以在没有它们的情况下调用它