栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PyInstaller打包的应用程序在控制台模式下工作正常,在窗口模式下崩溃

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PyInstaller打包的应用程序在控制台模式下工作正常,在窗口模式下崩溃

BadFileDescriptor
误差和因此存储器访问冲突由以下事实引起
stdout
的在窗口模式下的应用程序是一个固定大小的缓冲区。因此,如果您正在
stdout
使用
print
sys.stdout
直接写入,一段时间后您会看到这些错误。

您可以通过以下方法解决此问题:

  1. 删除/注释上的著作
    stdout
  2. 使用
    logging
    而不是打印到标准输出
  3. stdout
    在应用程序执行开始时进行重定向。尽管我认为将调试语句移至
    logging
    将是更好的选择,但这是一种解决方案,只需更改较少的代码。

要重定向,

stdout
您可以使用以下代码:

import sysimport tempfilesys.stdout = tempfile.TemporaryFile()sys.stderr = tempfile.TemporaryFile()

在执行程序之前。您还可以使用一些自定义对象将输出放入“ log”文件或其他文件中,重要的是输出不应填充固定大小的缓冲区。

例如,您可以执行以下操作以在

logging
不更改太多代码的情况下利用模块:

import sysimport loggingdebug_logger = logging.getLogger('debug')debug_logger.write = debug_logger.debug    #consider all prints as debug informationdebug_logger.flush = lambda: None   # this may be called when printing#debug_logger.setLevel(logging.DEBUG)      #activate debug logger outputsys.stdout = debug_logger

这种方法的缺点是对每一行

print
执行更多的调用
stdout.write

>>> print 'test'DEBUG:debug:testDEBUG:debug:

如果愿意,可以避免编写纯

write
函数
the_logger.debug
仅用“全行”调用的实际行为。

无论如何,我认为这类解决方案应该只是临时的,并且只能在将

print
s移植到to的调用之前使用
logging.debug

(显然,记录器应写入文件,而不是

stdout
避免错误。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/637096.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号