加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 禁止“程序无法启动因为X.dll丢失”错误弹出窗口

发布时间:2020-12-16 23:31:13 所属栏目:Python 来源:网络整理
导读:我有一个 Python程序,它使用os.system来执行各种命令. (它不能使用子进程,因为它必须向后兼容到Python 2.0.) 在Windows上,有时命令引用异常目录中的DLL,因此我得到臭名昭着的“程序无法启动因为X.dll缺失”错误弹出. 我的问题不是关于如何让命令找到它的所有
我有一个 Python程序,它使用os.system来执行各种命令. (它不能使用子进程,因为它必须向后兼容到Python 2.0.)

在Windows上,有时命令引用异常目录中的DLL,因此我得到臭名昭着的“程序无法启动因为X.dll缺失”错误弹出.

我的问题不是关于如何让命令找到它的所有DLL.我已经知道该怎么做了.我想知道的是,当DLL丢失时,如何告诉Windows不显示此对话框?相反,子进程应该将错误消息打印到stderr(已被重定向到os.system调用中的文件)并退出失败(导致os.system返回错误代码).这样我的程序就可以捕获错误并以自己的方式报告,而不是挂起,直到有人来点击确定.

MSDN通常是我的朋友,但这次我得到的建议是如何处理特定缺失的DLL,这很好,但这次不是我需要的.

重申一下,这是一种极端向后兼容的情况:我需要一个适用于Python 2.7或任何旧版本的解决方案,直到2.0.它还需要适用于所有仍然流行的Windows版本(XP,Vista,7,8).使用更旧的Windows是非常理想的,但不是100%要求.此外,不能选择使用任何其他语言编写的第三方模块和帮助程序. (我想.BAT文件可以,如果这是唯一的方法.)

解决方法

可以使用 SetErrorMode禁用调用进程的对话框.但是,您必须阅读 LoadLibrary文档以发现“加载时丢失的DLL”符合SEM_FAILCRITICALERRORS所涵盖的“严重错误”之一.

错误模式继承到子进程,只要它们不是用CREATE_DEFAULT_ERROR_MODE创建的,并且看起来CMD.EXE在创建子进程时不设置该标志.因此,在我的Python脚本中启动时设置错误模式确实会在我关心的情况下抑制对话框…

if sys.platform == 'win32':
    try:
        import ctypes
        # SEM_FAILCRITICALERRORS|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX
        ctypes.windll.kernel32.SetErrorMode(0x0001|0x0002|0x8000)
    except:
        pass

这不是一个最佳的解决方案:子进程终止于一个特定的错误代码(0xC0000135 – 实际上没有记录为“丢失的DLL”,但显然是从搜索该数字时出现的情况),但细节 – 如缺少哪个DLL – 被丢弃在地板上.我仍然希望找到一个让装载机向stderr报告详细信息的设置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读