Python subprocess.Popen stdin干扰stdout/stderr

Python subprocess.Popen stdin干扰stdout/stderr,python,subprocess,popen,Python,Subprocess,Popen,对此感到非常困惑。使用Popen时,如果仅使用stdout或stderr,则以下代码有效: def run(self): self.externalProcess = subprocess.Popen(['./external_process.out 1>&2'], shell=True, stderr=subprocess.PIPE) while self.externalBinary.poll() is None: print('Still ru

对此感到非常困惑。使用Popen时,如果仅使用stdout或stderr,则以下代码有效:

def run(self):
    self.externalProcess = subprocess.Popen(['./external_process.out 1>&2'], shell=True, stderr=subprocess.PIPE)
    while self.externalBinary.poll() is None:
        print('Still running')
    print('Done running')
我之所以使用stderr文件描述符,是因为我在GUI中实时监控流程输出,并且stderr是无缓冲的。请参阅我的另一个问题,了解关于这一混乱局面的更多背景:

我在这里遇到的问题是,只要我添加stdin以允许用户输入传递到外部进程,它就开始像stdout再次被缓冲一样工作:

def run(self):
    self.externalProcess = subprocess.Popen(['./external_process.out 1>&2'], shell=True, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
    while self.externalBinary.poll() is None:
        print('Still running')
    print('Done running')

我的问题是,为什么stdin似乎会影响stdout和stderr?

您可能会尝试(通过stdin)将数据写入子进程,并(通过stdout)以交互方式读取其输出

正如在对的回答中提到的,这是一个否定


您可以使用,但这是一个阻塞调用,它将等待所有通信完成(您不能像在示例中那样轮询)

看起来您可能试图将数据写入子进程(通过STDIN)并以交互方式读取其输出(通过STDOUT)

正如在对的回答中提到的,这是一个否定


您可以使用,但这是一个阻塞调用,将等待所有通信完成(您不能像示例中那样进行轮询)

问题的具体症状是什么?一些不应该被阻止的东西?同样,工作代码也会被感激-您的示例并没有像编写的那样运行。例如,什么是stdout=STDERR?是的,我注意到没有subprocess.STDERR这样的东西。现在应该修好了。症状是我的wxPython应用程序中有一个文本框,每次显示一行输出。当我添加stdin参数时,它只显示停止的几行。当我删除它时,它会继续显示我的外部进程的输出,这是一个C程序。您实际上在哪里向子进程发送输入?我在你的第二个例子中没有看到这种情况……我没有包括它,因为我一加上论点就看到了问题。我甚至不需要尝试使用stdin。在阅读了下面的链接后,我认为我的问题是由于缓存而导致死锁,所以我正在努力解决这个问题。在关闭子进程之前,我不需要使用stdin(我只是发送一个换行符来模拟按下enter键,这是程序干净退出的方式)。问题的具体症状是什么?一些不应该被阻止的东西?同样,工作代码也会被感激-您的示例并没有像编写的那样运行。例如,什么是stdout=STDERR?是的,我注意到没有subprocess.STDERR这样的东西。现在应该修好了。症状是我的wxPython应用程序中有一个文本框,每次显示一行输出。当我添加stdin参数时,它只显示停止的几行。当我删除它时,它会继续显示我的外部进程的输出,这是一个C程序。您实际上在哪里向子进程发送输入?我在你的第二个例子中没有看到这种情况……我没有包括它,因为我一加上论点就看到了问题。我甚至不需要尝试使用stdin。在阅读了下面的链接后,我认为我的问题是由于缓存而导致死锁,所以我正在努力解决这个问题。我不需要使用stdin,直到我关闭了子进程(我只是发送一个换行符来模拟按下enter键,这就是程序如何干净地退出)。链接不错。我以前不理解这个僵持的问题。我正试着让通讯正常工作,但还没到现在。请参阅我上面的评论。@tanders12:您对
communicate()
)有什么问题?communicate()将缓冲所有内容,直到孩子退出。我需要线路缓冲或无缓冲。我正在尝试在不更改孩子的代码的情况下完成这项工作。现在我正在尝试让pexpect工作,它看起来很有希望。很好的链接。我以前不理解这个僵持的问题。我正试着让通讯正常工作,但还没到现在。请参阅我上面的评论。@tanders12:您对
communicate()
)有什么问题?communicate()将缓冲所有内容,直到孩子退出。我需要线路缓冲或无缓冲。我正在尝试在不更改孩子的代码的情况下完成这项工作。现在我正试图让pexpect工作,它看起来很有希望。