2013-04-28 110 views
0

说在Python REPL I,分别称为os.close012它们是standard input, output and error。我如何重新打开/重新初始化它们?这样我会在函数或代码块的开始处关闭它们,并在返回之前重新打开。如何重新打开文件描述符0,1和2?

PS:Python特有的和通用的细节都将不胜感激。

+0

将它们复制到另一个文件描述符,然后将它们复制回来是否公平? – Xymostech 2013-04-28 15:25:59

+0

@Xymostech我真的问过这个问题来获得一些内在的(也许太技术)的过程细节。因此,答案可能包括*重复*,但重新开放的部分应该存在,或者可能是重复*是唯一解决方案的原因 – 2013-04-28 15:38:40

回答

2

您无法关闭它们然后重新打开它们,但是您可以复制它们并在完成后恢复以前的值。像这样的东西;

copy_of_stdin = os.dup(0) // Duplicate stdin to a new descriptor 
copy_of_stdout = os.dup(1) // Duplicate stdout to a new descriptor 
copy_of_stderr = os.dup(2) // Duplicate stderr to a new descriptor 
os.closerange(0,2)   // Close stdin/out/err 

...redirect stdin/out/err at will... 

os.dup2(copy_of_stdin, 0) // Restore stdin 
os.dup2(copy_of_stdout, 1) // Restore stdout 
os.dup2(copy_of_stderr, 2) // Restore stderr 
os.close(copy_of_stdin)  // Close the copies 
os.close(copy_of_stdout) 
os.close(copy_of_stderr)