4

在交互式控制台中:

>>> 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

4 回答 4

10

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

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

所以我们可以做魔术

sys.stdout = open("file", "w")

现在我们可以像写入标准输出一样写入该文件。

了解 unix 只是一大盒文件。Unix好心给我们/dev/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)
>>> 
于 2013-07-19T10:31:12.997 回答
8

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

但是,事实上,你并没有关闭sys.stdout真的。如果你想完全关闭它,你必须使用os.close(sys.stdout.fileno()). 您可以阅读为什么关闭 sys.stdout (stdin, stderr) 没有真正关闭它?为什么。在这种情况下,我不知道如何重新打开它。上面的方法甚至open('/dev/stdout', 'w')在我的 Linux 上都失败了。

于 2013-07-19T11:01:43.163 回答
0

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

主要答案是不要一开始就关闭它!

于 2013-07-19T10:06:45.177 回答
0

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

于 2013-07-19T16:22:42.377 回答