请看下面的Python代码。
执行完这段代码后,我仍然希望有可能将一些内容打印到标准输出(stdout)上。
我已经尝试过:
这些对象包含程序开始时stdin、stderr和stdout的原始值。它们在最终化期间使用,可以用于打印到实际的标准流上,而无论sys.std*对象是否已被重定向。
so = open('/tmp/test.log', 'a+')
os.dup2(so.fileno(), sys.stdout.fileno())
执行完这段代码后,我仍然希望有可能将一些内容打印到标准输出(stdout)上。
我已经尝试过:
print('Foo\n', file=sys.__stdout__)
根据文档所述,这可能是一种解决方法。
sys.__stdin__
sys.__stdout__
sys.__stderr__
这些对象包含程序开始时stdin、stderr和stdout的原始值。它们在最终化期间使用,可以用于打印到实际的标准流上,而无论sys.std*对象是否已被重定向。
但它并不是这种情况。它仍然记录在我的test.log文件中。
Python版本:3.4.8
非常感谢您的任何帮助。
dup2()
将原始stdout FD复制到另一个位置,然后再进行覆盖操作。例如,在bash中,你需要运行exec 4>&1
来让FD 4成为FD 1的副本,以便在exec >/tmp/test.log
之后能够还原FD 1的原始值。 - Charles Duffysys.__stdout__
指向 FD 1,但如果您覆盖 FD 1,则 Python 解释器将拥有一个文件描述符的句柄,该句柄不再指向原始 stdout -- 您在解释器层下方更改了该 FD 的目标,在操作系统级别上。您的 Python 文件对象指向操作系统级别的文件描述符;这些描述符确定给定对象实际连接到哪个操作系统级别的文件(套接字、流等)... 因此,当您切换 FD 时,您会更改连接到它的 所有 Python 对象。 - Charles Duffy