pythonw 3.6.6 sys.stdout 在重新分配时什么都不做
pythonw 3.6.6 sys.stdout doing nothing on reassign
我正在尝试调试我正在编写的 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++ 告诉我的那样,文件已更新,但文件始终是空的,即使它们应该有导入失败的错误消息,以及打印行
您上面发布的代码应该可以工作。您遇到的问题很可能是在流仍处于打开状态时检查文件。使用 open()
时,您总是需要以某种方式关闭流。在您执行此操作之前,通过其他方法(例如手动打开文件)检查文件时,您将看不到文件的更改。
在此示例中,您可以通过重新分配 sys.stdout
和 sys.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()
上面的这段代码可以让您测试异常路径是否已被触发。
我正在尝试调试我正在编写的 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++ 告诉我的那样,文件已更新,但文件始终是空的,即使它们应该有导入失败的错误消息,以及打印行
您上面发布的代码应该可以工作。您遇到的问题很可能是在流仍处于打开状态时检查文件。使用 open()
时,您总是需要以某种方式关闭流。在您执行此操作之前,通过其他方法(例如手动打开文件)检查文件时,您将看不到文件的更改。
在此示例中,您可以通过重新分配 sys.stdout
和 sys.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()
上面的这段代码可以让您测试异常路径是否已被触发。