我试图调试与Windows DLL的一个ctypes包装问题,当我通过交互式shell中运行测试已经注意到差异(Python或IPython中),当我运行脚本是非交互式的。Python的差异
我想知道是否有任何解释我在这里看到的差异?
具体而言,当我交互运行一个简单的测试,一个DLL调用将挂起,再也不回来,那里的准确运行的脚本相同的代码不会出现此问题。
要什么我的意思是更明确,想象你有下面的代码
from foobar import bar, foo
bar(foo(1,2,3))
放在一个文件时,说“myfoo.py”,并通过“蟒蛇myfoo.py” excecuted,上面的代码按预期执行。但是,如果你在上面输入到一个Python/IPython的外壳,该代码具有不同的行为(在我的情况下,挂起调用ctypes.WinDLL功能时)
一些额外的细节:
我使用的是相同的口译员和两种情况下的相同PYTHONPATH。 封装的DLL是Canon EDSDKv2.9,一个用于远程控制摄像头的SDK。 它总是挂在DLL中,而不是在Python代码中。
初始化时,我EDSDK包装启动一个线程其run方法是这样的:
def run(self):
sys.coinit_flags = 0 #use multithreaded mode
from pythoncom import PumpWaitingMessages
#^^ done here so this thread is correctly initialised
error(EDSDK.EdsInitializeSDK())
self.EDSDK_initialised = True
while self.active:
PumpWaitingMessages()
sleep(self.msg_sleep_time)
error(EDSDK.EdsTerminateSDK())
此线程的目的基本上是初始化SDK,泵的消息,并允许其他线程调用包装方法。
注:此工作过,既交互式和非交互式,在以前的版本中EDSDK。我目前的问题只发生在最新版本的EDSDK中。
我怀疑这可能是与线程(因此片断),但不能在网上找到的任何信息备份我的怀疑。
所以,交互式和非交互式运行时蟒是任何人都知道的任何差异?可能与windows线程有关?任何帮助,甚至是野蛮的猜测,在这一点上都会受到赞赏,因为我完全被绊倒了! :)