我正在使用 Python 的 ctypes 库与 Windows DLL 对话。当我从 IDLE、Ipython 运行我的代码或键入交互式 python 解释器时,它工作正常。当我从 Windows 命令提示符运行相同的代码时,它会崩溃。为什么一种方式崩溃,一种方式成功?
这是我正在运行的代码的简化版本:
import ctypes, os, sys
print "Current directory:", os.getcwd()
print "sys.path:"
for i in sys.path:
print i
PCO_api = ctypes.oledll.LoadLibrary("SC2_Cam")
camera_handle = ctypes.c_ulong()
print "Opening camera..."
PCO_api.PCO_OpenCamera(ctypes.byref(camera_handle), 0)
print " Camera handle:", camera_handle.value
wSensor = ctypes.c_uint16(0)
print "Setting sensor format..."
PCO_api.PCO_SetSensorFormat(camera_handle, wSensor)
PCO_api.PCO_GetSensorFormat(camera_handle, ctypes.byref(wSensor))
mode_names = {0: "standard", 1:"extended"}
print " Sensor format is", mode_names[wSensor.value]
当我从 IDLE 或 Ipython 运行此代码时,我得到以下结果:
Current directory: C:\Users\Admin\Desktop\code
sys.path:
C:\Users\Admin\Desktop\code
C:\Python27\Lib\idlelib
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages
Opening camera...
Camera handle: 39354336
Setting sensor format...
Sensor format is standard
>>>
当我从 Windows 命令提示符运行此代码时,我得到以下结果:
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\Admin>cd Desktop\code
C:\Users\Admin\Desktop\code>C:\Python27\python.exe test.py
Current directory: C:\Users\Admin\Desktop\code
sys.path:
C:\Users\Admin\Desktop\code
C:\Windows\system32\python27.zip
C:\Python27\DLLs
C:\Python27\lib
C:\Python27\lib\plat-win
C:\Python27\lib\lib-tk
C:\Python27
C:\Python27\lib\site-packages
Opening camera...
Camera handle: 43742176
Setting sensor format...
Traceback (most recent call last):
File "test.py", line 18, in <module>
PCO_api.PCO_GetSensorFormat(camera_handle, ctypes.byref(wSensor))
File "_ctypes/callproc.c", line 936, in GetResult
WindowsError: [Error -1609945086] Windows Error 0xA00A3002
C:\Users\Admin\Desktop\code>
请注意,一些 DLL 调用可以正常工作,直到我开始设置传感器格式,我们才偏离了轨道。
通过检查我正在调用的 DLL 附带的文档,我看到 Windows 错误解码为“缓冲区的 wSize 太小”。(原文如此)。我不确定这是否相关。以防万一,这里是 API 文档。
当我看到“在 IDLE 中工作,提示失败”时,我认为必须有一些不同的环境变量设置。我应该检查什么?
编辑:
我将 sys.path 和 os.getcwd() 添加到测试代码中。
编辑:
不确定这是否重要,但我加载的 DLL (SC2_Cam.dll) 位于当前工作目录中。此目录中还有另一个 DLL (sc2_cl_me4.dll),我相信它是由 SC2_Cam.dll 加载的。如果我从该目录中删除 sc2_cl_me4.dll,则对 SC2_Cam.dll 的调用都不起作用,包括 PCO_OpenCamera。
编辑:
如果我将上面的代码输入到“vanilla”交互式 python 解释器中,上面的代码也可以工作。我不需要 IDLE 或 ipython 来使其工作。仅调用“python.exe test.py”失败。