错误和因此的内存访问冲突是由窗口模式下的应用程序是一个固定大小的缓冲区BadFileDescriptor
这一事实引起的。因此,如果您正在使用或直接stdout
写入,一段时间后您会看到这些错误。stdout
print
sys.stdout
您可以通过以下方式解决此问题:
- 删除/注释掉关于
stdout
- 使用
logging
而不是打印到标准输出
stdout
在应用程序执行开始时重定向。这是需要更改的代码更少的解决方案,即使我认为将调试语句移至logging
将是更好的选择。
要重定向stdout
,您可以使用这种代码:
import sys
import tempfile
sys.stdout = tempfile.TemporaryFile()
sys.stderr = tempfile.TemporaryFile()
就在执行你的程序之前。您还可以使用一些自定义对象将输出放入“日志”文件或其他文件中,重要的是输出不应填充固定大小的缓冲区。
例如,您可以执行类似这样的操作,以便能够在logging
不更改太多代码的情况下利用该模块:
import sys
import logging
debug_logger = logging.getLogger('debug')
debug_logger.write = debug_logger.debug #consider all prints as debug information
debug_logger.flush = lambda: None # this may be called when printing
#debug_logger.setLevel(logging.DEBUG) #activate debug logger output
sys.stdout = debug_logger
这种方法的缺点是对每一行print
执行更多的调用:stdout.write
>>> print 'test'
DEBUG:debug:test
DEBUG:debug:
如果您愿意,您可能可以避免这种行为,编写一个仅使用“完整行”write
调用的真实函数。the_logger.debug
无论如何,我认为这种解决方案应该只是暂时的,并且只能在将print
s 移植到调用logging.debug
.
(显然,记录器应该写入文件而不是stdout
为了避免错误。)