subprocess.Popen () stdin проблемы

1
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, или, возможно, совершенно другой метод.

  • 0
    не помещайте процедурный код непосредственно в тело класса, например, в class test пример class test ; используйте функции / методы для этого.
Теги:
subprocess

2 ответа

0
Лучший ответ

Вот аналогичный вопрос:

Python и подпроцессные входные каналы

В этом случае OP также запускает jvm и ожидает ввода пользователя. Я думаю, вы замените цикл while вызовом select((sys.stdin,),(),()). Когда возвращается select(), вы должны ввести ввод для чтения из его возвращаемого значения, а затем передать его на ваш объект Popen.

0

Окончательное решение моей проблемы заключалось в изменении цикла 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. Даже после того, как я изменил цикл, этот простой аргумент сломал все

Ещё вопросы

Сообщество Overcoder
Наверх
Меню