为什么 subprocess.check_call 中的 stderr 会同时接收 stderr 和 stdout 流?

Why does stderr in subprocess.check_call receive both stderr and stdout streams?

我有一个 python 脚本(称之为 my_python_script.py),它使用

打印一些消息
print message_string

它还使用

输出进度百分比
sys.stdout.write(progress_string)

完成后,它会输出一些统计数据,因为我稍后想通过 stderr 将这些数据收集到一个文件中,我使用

sys.stderr.write(stats_string)

现在,在另一个脚本中,我用 subprocess.check_call() 调用上面的脚本,就像这样

file_obj = open('stats.log', 'a')
check_call(['my_python_script.py'], stderr=file_obj)
file_obj.close()

令我惊讶的是,file_obj 包含 my_python_script.py 的所有输出,包括 print 输出、sys.stdout.write 输出和 sys.stderr.write 输出。我预计它只会包含 sys.stderr.write.

的输出

为什么不是这样? check_call 是否默认将 stderr 重定向到 stdout

如果有一个简单的解决方法,我会很开心。谢谢。

顺便说一下,我在 Linux Fedora 上使用 Python 2.7。

您也可以尝试添加标准输出选项:

check_call(['my_python_script.py'], stdout=anotherfile_obj, stderr=file_obj)

我的猜测是 check_call 在未指定 stdout 时将 stderr 视为 stdout

或者您的脚本默认打印到 stderr

向社区致以最诚挚的歉意!!

这完全是我的错误。

这个错误的关键是双重的。

第一部分是这个定义

file_obj = open('stats.log', 'a')

注意 'a' - 这是故意的,但也是问题的一部分。其次,我忘了在完成后删除生成的文件(它应该是临时的,最后被复制到不同的位置)。因此,我所有的测试运行都累积到这个文件中,包括我使用 stdout 的初始测试。

哦,主啊。所以问题是:我应该删除原始问题还是可以用于说明目的?现在看来好傻