Python subprocess.Popen()stdin问题

Python subprocess.Popen()stdin问题,python,subprocess,Python,Subprocess,运行时不会出错,但运行时不能在提示下键入任何输入。不会显示任何字符或返回用户类型,但会打印运行jar的输出。我想让它做的是在terminal类中获取输入,处理它,并将输出输入到正在运行的java程序中。搜索完internet后,我只找到了subprocess.Popen(),但我想不出标准输出错误重定向。我将如何使用Popen解决此问题,或者使用完全不同的方法解决此问题这里有一个类似的问题: 本例中的OP还运行一个jvm并期望用户输入。我想您应该用调用select((sys.stdin,),(

运行时不会出错,但运行时不能在提示下键入任何输入。不会显示任何字符或返回用户类型,但会打印运行jar的输出。我想让它做的是在terminal类中获取输入,处理它,并将输出输入到正在运行的java程序中。搜索完internet后,我只找到了subprocess.Popen(),但我想不出标准输出错误重定向。我将如何使用Popen解决此问题,或者使用完全不同的方法解决此问题这里有一个类似的问题:


本例中的OP还运行一个jvm并期望用户输入。我想您应该用调用
select((sys.stdin,),(),())
来替换while循环。当
select()
返回时,您应该有输入来读取其返回值,然后通过管道传输到
Popen
对象。

我的问题的最终解决方案是按照AJ的建议更改while循环

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()
换电话

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)

我还必须更改shell=True参数。即使在我更改了循环之后,这个简单的参数也打破了一切

不要将过程代码直接放在类主体中,例如在
类测试
案例中;为此使用函数/方法。
p = subprocess.Popen(command, shell=False, stdin = subprocess.PIPE)