python - 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)
它确实创建了文件,正如我被记事本 ++ 告知的那样,文件已更新,但文件都始终为空,即使它们应该有来自设置为失败的导入的错误消息,以及打印行
解决方案
您在上面发布的代码应该可以工作。您遇到的问题很可能是在流仍处于打开状态时检查文件。使用时,open()
您总是需要以某种方式关闭流。除非您这样做,否则在通过其他方法(例如手动打开文件)检查文件时,您将看不到文件的更改。
在此示例中,您可以通过重新分配sys.stdout
andsys.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()
上面的代码让您测试异常路径是否已被触发。
推荐阅读
- javascript - 如何在 Node.js/Jest 中模拟嵌套模块响应
- r - 如何在r中读取列表列表
- python - 当 python 客户端在烧瓶中使用时,Grpc 请求失败
- c# - ASP.NET Web API 堆栈跟踪不可用 - UseProblemDetails
- kubernetes - CompositeController 在被 kubernetes 调用时没有得到`childrenJson`元素
- java - CellRenderer 中的 SetIcon 导致延迟
- pandas - 使用 1X2 的所有组合生成 db
- http-status-code-404 - 使用参数从其他站点重定向后找不到页面
- javascript - 如何从一行中获取所有数据作为柏树中的对象?
- android - 如何将 Jetpack Compose 中的子项传递给自定义可组合项?