程序在IDLE上运行正常,但在命令行失败。

2024-10-01 07:43:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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运行此代码时,得到以下结果:

^{pr2}$

从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太小了”(sic)。我不确定这是否相关。以防万一,here's the API documentation。在

当我看到“worksinidle,fails at prompt”时,我假设一定有一些环境变量设置不同。我应该检查什么?在

编辑:

我补充道系统路径以及操作系统getcwd()到测试代码。在

编辑:

不确定这是否重要,但是我加载的DLL(SC2_凸轮.dll)在当前工作目录中。在这个目录中还有另一个DLL(sc2_cl_me4.DLL),我相信它是由sc2加载的_凸轮.dll. 如果我从这个目录中删除sc2_cl_me4.dll,则不会对sc2进行任何调用_凸轮.dll工作,包括PCO峎OpenCamera。在

编辑:

如果我把上面的代码输入到“vanilla”交互式python解释器中,上面的代码也可以工作。我不需要IDLE或ipython来让它工作。只打电话'python.exe测试.py'失败了。在


Tags: 代码apiadminwindowscodectypesuserscamera
3条回答

你得到的错误让我相信你用来存储wSensor变量的16位整数太小了。我查看了他们的API,它只是将它指定为WORD类型,从微软的标准来看,它应该是16位,但是由于一个单词的大小有很多不明确的地方,请尝试将该值增加到32位或64位。在

至于为什么这会在不同的环境中导致不同的行为,您使用的是64位操作系统吗?您是否安装了不同版本的python?在

当你与一个C程序接口时,你会遇到C语言的所有困难。你所犯的任何错误都会导致缓冲区溢出、堆栈溢出、分段冲突等。如果程序因为错误而写入一个随机的内存位置,它的行为在所有情况下都不一样。在您的计算机上,它似乎在交互模式下工作,但从窗口命令提示符运行时崩溃。但在另一个操作系统上,或者在另一台机器上,甚至在另一天的同一台机器上,它的行为可能会有所不同。它的行为不是决定性的。在

有鉴于此,让我们看看下面的一行:

PCO_api.PCO_OpenCamera(ctypes.byref(camera_handle), 0)

根据API文档,在上面的调用中,PCO_OpenCamera函数不仅仅返回camera_handle中的值;它还使用camera_handle作为输入值。但是,您将camera_value未初始化。我知道你应该在打电话之前把它调零。另一个问题是PCO_OpenCamera返回一个应该检查的值。如果有问题,但程序继续运行,好像没有问题一样,它将继续对camera_handle使用随机值。所以程序中的一个错误似乎是前一行(保存打印)应该

^{pr2}$

另一个是不检查PCO_OpenCamera的返回值。(我不知道剩下的是否可以,我没有仔细检查过。)

另外,c_ulong是WindowsHANDLE类型的正确类型吗?我不知道,也许还可以。即使c_ulongHANDLE大,它仍然是可能的。但可能还不够,你必须确定自己知道自己在做什么。在

您的系统上是否安装了多个版本的python?当您以交互方式运行和从文件运行时,您可能使用了不同的版本。在

相关问题 更多 >