在交互式控制台中:
>>> 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()不会有道理。
答案 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就不会指向任何流/文件)。