Python 在Popen调用中是否可以捕获stdin、stdout和stderr以外的数据流?

Python 在Popen调用中是否可以捕获stdin、stdout和stderr以外的数据流?,python,stream,subprocess,stdout,stderr,Python,Stream,Subprocess,Stdout,Stderr,我正在将一个程序(samtools)合并到管道中。FYI samtools是一个用于操纵SAM格式的DNA序列比对的程序。它通过stdin和stdout接受输入并生成输出文件,因此通过pythons subprocess.Popen()可以很容易地控制它 当它运行时,它还向控制台输出短消息-显然不使用stdout-我想知道是否有可能通过获取操作系统生成的处理程序列表来捕获这些短消息 我想我的问题是,如果一个程序控制台输出不是来自stdout,那么它是否有可能捕获它?谢谢。除了stdout和std

我正在将一个程序(samtools)合并到管道中。FYI samtools是一个用于操纵SAM格式的DNA序列比对的程序。它通过stdin和stdout接受输入并生成输出文件,因此通过pythons subprocess.Popen()可以很容易地控制它

当它运行时,它还向控制台输出短消息-显然不使用stdout-我想知道是否有可能通过获取操作系统生成的处理程序列表来捕获这些短消息


我想我的问题是,如果一个程序控制台输出不是来自stdout,那么它是否有可能捕获它?谢谢。

除了stdout和stderr之外,没有其他控制台输出(假设samtools不通过tty设备直接写入终端)。因此,如果子流程stdout未捕获输出,则它必须已写入stderr,也可以使用
Popen()
stderr=subprocess.PIPE
并检查结果流程对象的
stderr
属性来捕获stderr。

除了stdout和stderr之外,没有其他控制台输出(假设samtools不通过tty设备直接写入终端)。因此,如果子进程stdout未捕获输出,则必须将其写入stderr,也可以使用
Popen()捕获输出
使用
stderr=subprocess.PIPE
并检查结果进程对象的
stderr
属性。

您使用的是什么操作系统?啊,是的,对不起。这是Linux Fedora。如果不是通过stdout或stderr,消息是如何到达控制台的?我真的不知道。我还没有看过源代码。我只知道它们是e不是stdout的一部分。但我必须承认,我没有检查stderror。将其用于非错误消息是常见的吗?是的,用于所有类型的带外信息,如进度、调试信息等。程序也可能在新的文件描述符中打开
/dev/tty
,并写入其中,以确保尽管有任何重定向,但它仍然会发送到终端。在这种情况下,拦截更为棘手,因为它涉及到创建一个伪终端。您使用的是什么操作系统?啊,是的,对不起。它是Linux Fedora。如果不是通过stdout或stderr,消息是如何到达控制台的?我真的不知道。我还没有看过源代码。我只知道它们是不是stdout的一部分。但是我必须承认,我没有检查stderror。将其用于非错误消息是常见的吗?是的,用于所有类型的带外信息,如进度、调试信息等。程序也可能在新的文件描述符中打开
/dev/tty
,并写入该文件描述符,以确保它是正确的尽管有任何重定向,但仍会将其发送到终端。在这种情况下,拦截更为棘手,因为它涉及到创建一个伪终端。非常感谢-我也想道歉。我感到有点尴尬,因为我没有检查stderror。这确实是我问题的关键。我现在更聪明了。非常感谢-我也希望我很抱歉。我觉得有点尴尬,因为我没有检查标准错误。这确实是我问题的关键。我现在更聪明了。