2013-04-25 2 views
0

Я бегу сценарий Python, который запускает класс Java, который требует недетерминированную пользовательского ввода:Чтение Java System.out.print с помощью Python подпроцесс

import sys 
import subprocess 
from subprocess import Popen, PIPE 

p = Popen("java myclass", shell=True, stdout=subprocess.PIPE) 

while True: 
    inline = p.stdout.readline() 
    if not inline: 
     break 

sys.stdout.write(inline) 
sys.stdout.flush() 

Когда выход отображается с помощью System.out.print(), выход отображается правильно. Однако, когда приглашение для ввода пользователя печатается с System.out.print(), вывод не отображается. Я попытался переключить p.stdout.readline() на p.stdout.read(), но затем вывод не выводится. Есть ли способ отобразить приглашение ввода, которое не имеет возврата каретки?

EDIT

Например, если класс Java содержит следующее:

System.out.println("Message 1); 
System.out.println("Message 2); 
System.out.print("Enter a number:") 

Запуск чистый код Java будет отображать все 3 линии.

код работает через Python будет отображаться только следующее:

Message 1 
Message 2 
+0

Вы можете использовать 'strip' удалить возврат каретки:.' Инлайн = p.stdout.readline() полоса() ' –

+0

Я смущен. Все распечатки System.out выполняются в STDOUT, поэтому чтение должно быть не таким. Тем не менее, System.in читает из STDIN, поэтому вам придется записывать «пользовательский ввод» с соответствующей комбинацией клавиш, чтобы указать, что вход остановлен. – CodeChimp

ответ

2
p1 = subprocess.Popen(["/usr/bin/java", "MyClass"], stdout=subprocess.PIPE) 
print p1.stdout.read() 
+0

Спасибо, мне удалось получить приглашение, используя это: –

Смежные вопросы