How do I revert sys.stdout.close()?

python

Solution

Okay, so I hope you are on a unix system...

Basically sys.stdout is just a variable containing any writable object.

So we can do magic like

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

and now we can write to that file as if it was stdout.

Knowing unix is just one big box of files. Unix is kind enough to give us `/dev/stdout`

So to re-open stdout its simple

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

Job done, you now have a new stdout opened up.

Edit

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

Problem

In the interactive console: ``` >>> 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 ``` Attempting to revert: ``` >>> sys.stdout.open() (...) AttributeError: 'file' object has no attribute 'open' >>> sys.stdout.write('foo') (...) ValueError: I/O operation on closed file ``` I agree that it's a frivolous question, but I'm curious how sys.stdout.close() can be reverted in Python (without restarting the interactive console, of course) and why sys.stdout.open() does not make sense.

Original source