为什么 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 的初始测试。
哦,主啊。所以问题是:我应该删除原始问题还是可以用于说明目的?现在看来好傻
我有一个 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 的初始测试。
哦,主啊。所以问题是:我应该删除原始问题还是可以用于说明目的?现在看来好傻