I'm using Python's ctypes library to talk to a Windows DLL. When I run my code from IDLE, Ipython, or typed into the interactive python interpreter, it works fine. When I run the same code from the Windows command prompt, it crashes. Why does one way crash, and one way succeed?
Here's a simplified version of the code I'm running:
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]
When I run this code from IDLE or Ipython, I get the following result:
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
>>>
When I run this code from the Windows command prompt, I get the following results:
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>
Notice that a few of the DLL calls work, it isn't until I get to setting the sensor format that we go off the rails.
By inspecting the documentation that came with the DLL I'm calling, I see the Windows Error decodes to "The wSize of a buffer is to small." (sic). I'm not sure that's relevant. Just in case it matters, here's the API documentation.
When I see "works in IDLE, fails at prompt", I assume there must be some environment variable set differently. What should I check?
EDIT:
I added sys.path and os.getcwd() to the test code.
EDIT:
Not sure if this matters, but the DLL I load (SC2_Cam.dll) is in the current working directory. Also in this directory is another DLL (sc2_cl_me4.dll), which I believe is loaded by SC2_Cam.dll. If I remove sc2_cl_me4.dll from this directory, none of the calls to SC2_Cam.dll work, including PCO_OpenCamera.
EDIT:
The code above also works if I type it into the 'vanilla' interactive python interpreter. I don't need IDLE or ipython to make it work. Only calling 'python.exe test.py' fails.
os.getcwd()
andsys.path
for both in-IDLE and command-line executions. – Capreolatewpython.exe
vspython.exe
distinction? If so, trywpython.exe test.py
instead. – Cattailpythonw.exe
? – Levigateimport time
and atime.sleep(10)
to the end of the script above, and watched the pythonw.exe process in task manager. The process does not last 10 seconds, unless I comment out the line that crashes python.exe. – Decillion