【发布时间】:2018-10-12 13:19:34
【问题描述】:
我不确定这个问题是 Python 还是 shell 问题。
我有一个 Python 程序,它在命令上使用子进程调用,该命令可以在 stderr 上发出错误消息。我自己的程序也使用 sys.stderr 来记录错误。这是一个简单的例子,命令 (ls *.foobar) 失败:
import sys,subprocess
sys.stderr.write("--Hello\n")
try:
subprocess.check_call("ls *.foobar",shell=True)
except subprocess.CalledProcessError as e:
sys.stderr.write("Command failed\n")
sys.stderr.write("--Bye\n")
当我运行此代码时,控制台上的输出(来自 stderr)如下:
--你好
ls: 无法访问 '*.foobar': 没有这样的文件或目录
命令失败
--再见
如果我将 stderr 重定向到一个文件(例如,使用 python myscript.py 2> 日志),该文件包含以下内容:
ls: 无法访问 '*.foobar': 没有这样的文件或目录
--你好
命令失败
--再见
有没有办法保持文件中消息的顺序(除了在子进程调用中对文件使用 stderr 的显式重定向)?
这个问题类似于一些标准的 stdout/stderr 问题,但在这里,一切都应该在 stderr 上。
【问题讨论】:
-
记录在案:这种行为并不总是发生,它不是确定性的(例如在我的系统上它现在没有)。请参阅 Martin 的回复,了解其发生的原因。