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

时间:2016-12-08 14:12:01

标签: python python-2.7 subprocess stdout stderr

我有一个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。

2 个答案:

答案 0 :(得分:0)

您也可以尝试添加stdout选项:

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

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

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

答案 1 :(得分:0)

我最诚挚的向社区道歉!!

这对我来说完全是个错误。

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

第一部分是这个定义

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

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

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