0
说在Python REPL I,分别称为os.close
与0
,1
和2
它们是standard input, output and error。我如何重新打开/重新初始化它们?这样我会在函数或代码块的开始处关闭它们,并在返回之前重新打开。如何重新打开文件描述符0,1和2?
PS:Python特有的和通用的细节都将不胜感激。
说在Python REPL I,分别称为os.close
与0
,1
和2
它们是standard input, output and error。我如何重新打开/重新初始化它们?这样我会在函数或代码块的开始处关闭它们,并在返回之前重新打开。如何重新打开文件描述符0,1和2?
PS:Python特有的和通用的细节都将不胜感激。
您无法关闭它们然后重新打开它们,但是您可以复制它们并在完成后恢复以前的值。像这样的东西;
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)
将它们复制到另一个文件描述符,然后将它们复制回来是否公平? – Xymostech 2013-04-28 15:25:59
@Xymostech我真的问过这个问题来获得一些内在的(也许太技术)的过程细节。因此,答案可能包括*重复*,但重新开放的部分应该存在,或者可能是重复*是唯一解决方案的原因 – 2013-04-28 15:38:40