如何还原sys.stdout.close()?

时间:2013-07-19 09:48:11

标签: python

在交互式控制台中:

>>> import sys
>>> sys.stdout
<open file '<stdout>', mode 'w' at 0xb7810078>
>>> sys.stdout.close()
>>> sys.stdout # confirming that it's closed
(...) ValueError: I/O operation on closed file

试图恢复:

>>> sys.stdout.open()
(...) AttributeError: 'file' object has no attribute 'open'
>>> sys.stdout.write('foo')
(...) ValueError: I/O operation on closed file

我同意这是一个无聊的问题,但我很好奇如何在Python中恢复sys.stdout.close()(当然不重新启动交互式控制台)以及为什么sys.stdout.open()不会有道理。

4 个答案:

答案 0 :(得分:10)

好的,所以我希望您使用的是unix系统......

基本上sys.stdout只是一个包含任何可写对象的变量。

所以我们可以像

一样做魔术
sys.stdout = open("file", "w")

现在我们可以将该文件写为stdout。

了解unix只是一大盒文件。 Unix非常友好,可以给我们/dev/stdout

所以重新打开stdout的简单

sys.stdout = open("/dev/stdout", "w")

完成工作,你现在已经打开了一个新的标准。

修改

>>> os.fstat(1)
posix.stat_result(st_mode=8592, st_ino=7, st_dev=11L, st_nlink=1, st_uid=1000, st_gid=5, st_size=0, st_atime=1374230552, st_mtime=1374230552, st_ctime=1374230434)
>>> sys.stdout.close()
>>> sys.stdout = open("/dev/stdout", "w")
>>> sys.stdout.fileno()
3
>>> os.fstat(3)
posix.stat_result(st_mode=8592, st_ino=7, st_dev=11L, st_nlink=1, st_uid=1000, st_gid=5, st_size=0, st_atime=1374230576, st_mtime=1374230576, st_ctime=1374230434)
>>> os.fstat(1)
posix.stat_result(st_mode=8592, st_ino=7, st_dev=11L, st_nlink=1, st_uid=1000, st_gid=5, st_size=0, st_atime=1374230576, st_mtime=1374230576, st_ctime=1374230434)
>>> 

答案 1 :(得分:6)

在您的情况下,您可以sys.stdout返回sys.stdout = os.fdopen(1, 'w', 0)

但实际上,你并没有真正关闭sys.stdout。如果要完全关闭它,则必须使用os.close(sys.stdout.fileno())。您可以阅读Why doesn’t closing sys.stdout (stdin, stderr) really close it?了解原因。在这种情况下,我不知道如何重新打开它。上面的方法甚至open('/dev/stdout', 'w')在我的Linux上都失败了。

答案 2 :(得分:0)

sys.stdout.open()没有任何意义,因为open将文件名和模式作为参数,而关闭的流对象没有open方法。

主要答案是 首先不要关闭它!

答案 3 :(得分:0)

sys.stdout.open()没有意义,而sys.stdout.close()确实(尽管明显对称),是.open()和.close()适用于流/文件,sys.stdout只是一个指针(一旦后者关闭,sys.stdout就不会指向任何流/文件)。