Программа работает в IDLE, но не работает в командной строке

Я использую библиотеку 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 
    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 расшифровывается как «Размер буфера слишком мал». (так в оригинале). Я не уверен, что это актуально. На всякий случай вот документация по 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.

РЕДАКТИРОВАТЬ:

Приведенный выше код также работает, если я ввожу его в «ванильный» интерактивный интерпретатор Python. Мне не нужен IDLE или ipython, чтобы заставить его работать. Не удается выполнить только вызов «python.exe test.py».

6
задан Andrew 14 May 2012 в 15:50
поделиться