作为脚本运行和通过交互式 shell 运行之间的 Python 区别

标签 python multithreading com ctypes

我正在尝试使用 Windows DLL 的 ctypes 包装器调试问题,并注意到当我通过交互式 shell(python 或 ipython)运行测试时和非交互式运行脚本时的差异。

我想知道我在这里看到的差异是否有任何解释?

具体来说,当我以交互方式运行一个简单测试时,DLL 调用将挂起并且永远不会返回,而与脚本运行完全相同的代码不会出现此问题。

为了更明确地说明我的意思,假设您有以下代码

from foobar import bar, foo
bar(foo(1,2,3))

当放入文件时,说“myfoo.py”,并通过“python myfoo.py”执行,上面的代码按预期执行。但是,如果您在 python/ipython shell 中输入上面的代码,代码的行为会有所不同(在我的例子中,调用 ctypes.WinDLL 函数时挂起)

一些额外的细节:

在这两种情况下,我都使用相同的解释器和相同的 PYTHONPATH。 被包装的 DLL 是 Canon EDSDKv2.9,一个远程控制相机的 SDK。 它总是卡在 DLL 中,而不是在 python 代码中。

初始化后,我的 EDSDK 包装器启动一个线程,其运行方法如下所示:

  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 中。

我怀疑这可能与线程有关(因此是代码段),但无法在网上找到任何信息来支持我的怀疑。

那么,有人知道交互式和非交互式运行 python 时有什么区别吗?可能与 Windows 线程有关?在这一点上,任何帮助,甚至是疯狂的猜测,都将不胜感激,因为我完全被难住了! :)

最佳答案

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

参见 this article至于为什么会发生这种情况(tl; dr 是 IDLE 和线程不混合)。至于如何解决这个问题,请使用控制台而不是 IDLE GUI。或者,您可以只使用脚本。

关于作为脚本运行和通过交互式 shell 运行之间的 Python 区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4026820/

相关文章:

windows - 您可以从服务器端 javascript 调用 COM 组件吗?

python - 如何跟踪使用 CPU 与 GPU 进行深度学习的时间?

javascript - 如何制作调查机器人?

c++ - 使用循环停止 QThread 的正确方法(从 opencv 读取视频)

multithreading - bash:写入命名管道是原子的吗?

c++ - XPATH 包含(字符串,字符串)不工作

python - 为什么 Tkinter Canvas 线条参差不齐?

javascript - 使用 COM + IE 自动化进行 JavaScript 回发后保存文本文件

java - Box.add() 线程安全吗?

c++ - 如何在 webkit 浏览器控件中返回指向 JavaScript 的 IDispatch 指针