pythonw 3.6.6 sys.stdout在重新分配时不执行任何操作

时间:2019-04-02 13:23:43

标签: python python-3.x python-3.6 pythonw

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

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

它确实创建了文件,正如notepad ++告诉我的那样,文件已更新,但是文件都始终为空,即使它们应该将导入中的错误消息设置为失败,并且打印行

1 个答案:

答案 0 :(得分:0)

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

在此示例中,您可以通过重新分配sys.stdoutsys.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()

上面的代码可让您测试是否已触发了除外路径。