计划在空闲的工作,但在命令行失败(Program works in IDLE, but fails

2019-09-17 02:59发布

我使用Python的ctypes的图书馆跟一个Windows动态链接库。 当我从空转我的代码,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]

当我运行从空闲或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文档 。

当我看到“在空闲的作品,失败的提示”,我认为必须有一些环境变量设置不同。 我应该怎么检查?

编辑:

我加入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解释器上面还代码工作。 我不需要空闲或IPython的,使其工作。 只有调用“python.exe test.py”失败。

Answer 1:

当你用一个C程序的接口,你会得到C的所有困难,你所做的任何错误会导致缓冲区溢出,栈溢出,分段违规,等等。如果程序,因为有一个错误,写入随机内存位置,其行为不会在所有情况下是相同的。 在你的机器,似乎在交互模式下工作,但是从窗口命令提示符下运行时崩溃。 但在另一个操作系统,或者另一台机器上,甚至在另一天在同一台机器,它可以表现不同。 它的行为是不确定的。

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

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

根据API文档,在上面的调用, PCO_OpenCamera函数不只是返回一个值camera_handle ; 它也使用camera_handle作为输入值。 但是,你离开camera_value初始化。 据我所知,你应该在调用前将其设置为零。 另一个问题是, PCO_OpenCamera返回应检查的值。 如果有问题,但程序继续,当然,如果没有,它会继续使用随机值的camera_handle 。 所以在节目中有一个错误似乎是前行(保存打印)应

camera_handle = ctypes.c_ulong(0)

而另一个是的返回值PCO_OpenCamera未选中。 (我不知道剩下的就OK了,我还没有仔细过去,审查。)

而且, c_ulong为Windows的正确类型HANDLE类型? 我不知道,这可能是确定。 即使c_ulong大于HANDLE ,它仍然可能确定。 但可能是不够的; 你必须确定你知道自己在做什么。



Answer 2:

你有你的系统里安装了Python的多个版本? 也许你当您以交互方式运行,当你从一个文件中运行它使用不同的版本。



Answer 3:

你得到的错误使我相信,你正在使用存储wSensor变量的16位整数太小。 我看了看他们的API,这只是其指定为WORD类型,这在历史上由微软的标准应该是16位,但因为有很多不确定性的围绕一个字有多大,尝试的价值正在增加,以32或64位。

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



文章来源: Program works in IDLE, but fails at the command line