【问题标题】:Why does stderr in subprocess.check_call receive both stderr and stdout streams?为什么 subprocess.check_call 中的 stderr 同时接收 stderr 和 stdout 流?
【发布时间】:2017-04-23 19:35:29
【问题描述】:

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

【问题讨论】:

  • 如果您的脚本打印 sys.stdout.fileno()sys.stderr.fileno() 输出相同吗?

标签: python python-2.7 subprocess stdout stderr


【解决方案1】:

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

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

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

要么,要么你的脚本默认打印到stderr

【讨论】:

【解决方案2】:

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

这完全是我的错误。

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

第一部分是这个定义

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

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

天啊。所以问题是:我应该删除原始问题还是对说明有用?现在看起来很傻。

【讨论】:

  • 我会删除这个问题,因为它对网站的未来访问者没有任何用处。感谢您让我们知道结果。
  • 我试过了,但不被允许。相反,我已将其标记为供版主注意。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多