Как выполнить Java-программу с использованием Python с учетом входов и выходов как - PullRequest
3 голосов
/ 17 февраля 2012

Рассмотрим мою программу на 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", затем он снова печатает вывод как «Введите строку Это Джон», то есть он обеспечивает весь вывод два раз. Может быть, один вывод из-за кода Python input=subprocess.Popen(cmd,stdin=PIPE) и второй вывод из-за кода print proc.stdout.read() Я хочу, чтобы это было напечатано только один раз. Что я должен делать? Я хочу, чтобы моя переменная python получала все выходные данные java-программы, и, используя эту переменную, я буду отображать выходные данные на экране. Также, если есть входные данные для java-программы, я хочу, чтобы этот пользователь ввел входные данные, которые будут храниться в моей переменной python, и, используя эту переменную, я хочу передать входные данные java-программе. Что мне делать?

1 Ответ

7 голосов
/ 17 февраля 2012

Вы должны использовать communicate вместо stdout.read. Аргумент communicate является входом для подпроцесса. Кроме того, плохая идея передавать 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...