首页 > 解决方案 > pythonw 3.6.6 sys.stdout 在重新分配时什么也不做

问题描述

我正在尝试调试我正在编写的 pythonw 脚本,因为它在通过空闲启动它时有点工作,但是在通过 cmd 启动它或双击它时它会崩溃。我目前失败的代码是

import sys
sys.stdout = open("mylog.txt", "w")
sys.stderr = open("errors.txt", "w")
print("hello world")
import thisisgonnafail
print(sys.executable)

它确实创建了文件,正如我被记事本 ++ 告知的那样,文件已更新,但文件都始终为空,即使它们应该有来自设置为失败的导入的错误消息,以及打印行

标签: pythonpython-3.xpython-3.6pythonw

解决方案


您在上面发布的代码应该可以工作。您遇到的问题很可能是在流仍处于打开状态时检查文件。使用时,open()您总是需要以某种方式关闭流。除非您这样做,否则在通过其他方法(例如手动打开文件)检查文件时,您将看不到文件的更改。

在此示例中,您可以通过重新分配sys.stdoutandsys.stderr或调用close()(首选方法,因为它更明确,并且是处理流的预期方式)对它们进行操作,如下所示sys.stdout.close()

另外,请注意,如果您将多次打开和关闭它们,最好使用"a"附加到文件,而不是一直重写内容。

编辑:您在评论中询问了以这种方式处理错误的问题。您建议的方法是正确的,您可以关闭try/except部分代码并except关闭流。

import sys
sys.stderr = open("e.txt", "a")
try:
    import nonexistingmodule
    print 'Should not be printed out'
except:
    print 'Should be printed out'
    sys.stderr.close()

上面的代码让您测试异常路径是否已被触发。


推荐阅读