python - 抑制 "The program can' t 启动,因为 X.dll 丢失”错误弹出窗口

标签 python windows cmd

我有一个 Python 程序,它使用 os.system 来执行各种命令。 (它不能使用 subprocess,因为它必须一直向后兼容到 Python 2.0。)

在 Windows 上,有时该命令会引用不寻常目录中的 DLL,因此我会收到臭名昭著的“程序无法启动,因为缺少 X.dll”错误弹出窗口。

Windows error popup with title "cl.exe - System Error" and text "The program can't start because mspdb80.dll is missing from your computer. Try reinstalling the program to fix this problem."

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

MSDN 通常是我的 friend ,但这次我只得到有关如何处理特定丢失的 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 丢失 — 掉在地上。我仍然希望在某个地方找到一个设置,使加载程序将详细信息报告给标准错误。

关于python - 抑制 "The program can' t 启动,因为 X.dll 丢失”错误弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16223199/

相关文章:

python - 按主键对 sqlalchemy 关系进行排序

Python打印列表列表中的第n个元素

c# - .NET 运行时 (CLR)、JIT 编译器究竟位于何处?

java - 无法在 Java 中复制 "My Documents"

c - 使用 C 和原始 Win32 设置按钮图标

python - FFmpeg 最小化内存使用或向 youtube-dl 添加超时

Python MySQLdb : table does not get deleted immediately

Windows 7 - 'make' 不是内部或外部命令,也不是可运行的程序或批处理文件

windows - 为什么 "%~fI"参数扩展能够 "access"不是现有的驱动器?

python - 如何在此 Tensorflow 模型中保存和加载 BatchNormalization 层?