2010-10-26 75 views
4

我试图调试与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线程有关?任何帮助,甚至是野蛮的猜测,在这一点上都会受到赞赏,因为我完全被绊倒了! :)

回答

1

Python交互式解释器不是线程安全的。因此,如果您尝试发送阻止命令,则整个解释器将挂起。

this article,为什么发生这种情况(文艺青年最爱的是,空闲和线程不混合)。至于如何解决这个问题,请使用控制台而不是IDLE GUI。或者,您可以使用脚本。

1

在异步或并发操作(例如多线程,多处理)的环境中需要记住这一点。对于交互式运行Python的所有意图和目的,您没有主循环。即使__name__设置为__main__,但在此处分配或执行的任何操作都可能不可用。特别是多处理的情况,以及在某些情况下多线程,其中对象的状态可能不会在进程/线程之间共享。

这种行为在最坏情况下可能会令人困惑,最糟糕的情况是危险的。在调试时进入的一个好习惯是始终命名你的线程,并使用Python的logging模块来配对,以跟踪幕后发生的事情。