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

前端之家收集整理的这篇文章主要介绍了python – 禁止“程序无法启动因为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报告详细信息的设置.

猜你在找的Python相关文章