import subprocess
import threading
import StringIO
class terminal(threading.Thread):
def run(self):
self.prompt()
def prompt(self):
x = True
while x:
command = raw_input(':')
x = self.interpret(command)
def interpret(self,command):
if command == 'exit':
return False
else:
print 'Invalid Command'
return True
class test(threading.Thread):
command = 'java -jar ../bukkit/craftbukkit.jar'
test = StringIO.StringIO()
p = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while (p.poll() == None):
line = p.stderr.readline()
if not line: break
print line.strip()
term = terminal()
testcl = test()
term.start()
testcl.start()
Это выполняется без ошибок, однако при запуске вы не можете вводить любой ввод в приглашении. Символы не отображаются или не отображаются типы пользователей, но выводится результат работы флага. То, что я ищу, это сделать ввод в классе терминала, обработать его и вывести фид в запущенную java-программу. После очистки Интернета все, что я нашел, это subprocess.Popen(), но я не могу определить перенаправление stdin-out-err. Как я могу решить эту проблему, используя Popen, или, возможно, совершенно другой метод.
Вот аналогичный вопрос:
Python и подпроцессные входные каналы
В этом случае OP также запускает jvm и ожидает ввода пользователя. Я думаю, вы замените цикл while вызовом select((sys.stdin,),(),())
. Когда возвращается select()
, вы должны ввести ввод для чтения из его возвращаемого значения, а затем передать его на ваш объект Popen
.
Окончательное решение моей проблемы заключалось в изменении цикла while, поскольку AJ предложил
while x:
select.select((sys.stdin,),(),())
a = sys.stdin.read(1)
if not a == '\n':
sys.stdout.write(a)
sys.stdout.flush()
else:
x = self.interpret(command)
и изменение вызова Popen
p = subprocess.Popen(command, shell=False, stdin = subprocess.PIPE)
Мне также пришлось изменить аргумент shell = True. Даже после того, как я изменил цикл, этот простой аргумент сломал все
class test
примерclass test
; используйте функции / методы для этого.