我有一个 Python 程序,它使用 os.system
来执行各种命令。 (它不能使用 subprocess
,因为它必须一直向后兼容到 Python 2.0。)
在 Windows 上,有时该命令会引用不寻常目录中的 DLL,因此我会收到臭名昭著的“程序无法启动,因为缺少 X.dll”错误弹出窗口。
我的问题不是关于如何让命令找到它的所有 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/