python – 程序在IDLE中工作,但在命令行失败

python – 程序在IDLE中工作,但在命令行失败,第1张

概述我正在使用 Python的ctypes库与Windows DLL进行通信.当我从IDLE,Ipython运行我的代码,或者输入交互式python解释器时,它工作正常.当我从Windows命令提示符运行相同的代码时,它崩溃了.为什么单向崩溃,一种方式成功? 这是我正在运行的代码的简化版本: import ctypes, os, sysprint "Current directory:", os. 我正在使用 Python的ctypes库与windows DLL进行通信.当我从IDLE,Ipython运行我的代码,或者输入交互式python解释器时,它工作正常.当我从windows命令提示符运行相同的代码时,它崩溃了.为什么单向崩溃,一种方式成功?

这是我正在运行的代码的简化版本:

import ctypes,os,sysprint "Current directory:",os.getcwd()print "sys.path:"for i in sys.path:    print iPCO_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.valuewSensor = 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\codesys.path:C:\Users\admin\Desktop\codeC:\Python27\lib\IDlelibC:\windows\system32\python27.zipC:\Python27\DLLsC:\Python27\libC:\Python27\lib\plat-winC:\Python27\lib\lib-tkC:\Python27C:\Python27\lib\site-packagesopening camera... Camera handle: 39354336Setting 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\codeC:\Users\admin\Desktop\code>C:\Python27\python.exe test.pyCurrent directory: C:\Users\admin\Desktop\codesys.path:C:\Users\admin\Desktop\codeC:\windows\system32\python27.zipC:\Python27\DLLsC:\Python27\libC:\Python27\lib\plat-winC:\Python27\lib\lib-tkC:\Python27C:\Python27\lib\site-packagesopening camera... Camera handle: 43742176Setting 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 GetResultwindowsError: [Error -1609945086] windows Error 0xA00A3002C:\Users\admin\Desktop\code>

请注意,一些DLL调用工作,直到我设置传感器格式,我们离开轨道.

通过检查我正在调用的DLL附带的文档,我看到windows错误解码为“缓冲区的wSize是小的”. (原文如此).我不确定这是否相关.万一重要,here’s the API documentation.

当我看到“在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’失败.

解决方法 当您与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的返回值. (我不知道其余的是否合适,我没有仔细检查过.)

另外,c_ulong是windows HANDLE类型的正确类型吗?我不知道,也没关系.即使c_ulong大于HANDLE,它仍然可能正常.但可能还不够;你必须确定你知道自己在做什么.

总结

以上是内存溢出为你收集整理的python – 程序在IDLE中工作,但在命令行失败全部内容,希望文章能够帮你解决python – 程序在IDLE中工作,但在命令行失败所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存