我有一个Python程序,它使用os.system
来执行各种命令。 (它不能使用subprocess
因为它必须向后兼容到 Python 2.0。)
在 Windows 上,有时该命令会引用异常目录中的 DLL,因此我会收到臭名昭著的“程序无法启动,因为 X.dll 丢失”错误弹出窗口。
我的问题是not关于如何让命令找到它的所有 DLL。我已经知道该怎么做了。我想知道的是,我如何告诉 Windows不显示此对话框当 DLL 丢失时?相反,子进程应该将错误消息打印到 stderr(它已被重定向到os.system
调用)并退出失败(导致os.system
返回错误代码)。这样我的程序就可以捕获错误并以自己的方式报告它,而不是挂起直到有人点击“确定”。
MSDN 通常是我的朋友,但这次我只得到了有关如何处理特定缺失 DLL 的建议,这很好,但不是我这次需要的。
重申一下,这是一种极端向后兼容的情况:我需要一个可以与 Python 2.7 或任何旧版本一起使用的解决方案,直到 2.0。它还需要在所有仍然流行的 Windows 版本(XP、Vista、7、8)上运行。与...一起工作甚至更老Windows 是非常理想的,但不是 100% 需要。此外,不能选择以任何其他语言编写的第三方模块和帮助程序。 (我想一个.BAT
文件就可以了,如果这是唯一的方法的话。)
可以通过以下方式禁用调用进程的对话框SetErrorMode http://msdn.microsoft.com/en-us/library/windows/desktop/ms680621%28v=vs.85%29.aspx。但是,您必须阅读LoadLibrary http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx文档发现“加载时缺少 DLL”属于 所涵盖的“严重错误”之一SEM_FAILCRITICALERRORS
.
错误模式会继承到子进程,只要它们不是用CREATE_DEFAULT_ERROR_MODE http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29.aspx,并且 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 报告详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)