gpt4 book ai didi

python - 如何在 Python 中的单独线程中启动 win32 应用程序

转载 作者:行者123 更新时间:2023-12-01 05:27:00 26 4
gpt4 key购买 nike

所以,我有以下代码片段,它尝试通过 win32api 启动 Microsoft Powerpoint:

import threading
import win32com.client
import sys

class myDemo(threading.Thread):

def __init__(self):
threading.Thread.__init__(self)

def run(self):
try:
myObject = win32com.client.Dispatch("Powerpoint.Application")
print "OK"
except:
print "Failed to start Powerpoint!"
sys.exit(1)
print "Now attempting to shutdown..."
try:
myObject.quit()
except:
print "Error"


if __name__ == "__main__":
test = myDemo()
test.start()

问题是它失败了,我不知道为什么。但是,如果我将最后一行更改为 test.run() 它将成功启动。那么为什么 test.start() 会失败呢?

为什么会发生这种情况?考虑到我需要 Powerpoint 在单独的线程上异步运行,我应该如何解决它?

提前致谢。

编辑:显然我的问题与此有关:http://python.6.x6.nabble.com/Dispatch-error-CoInitialize-has-not-been-called-td1951088.html

然而,除了提出的正确解决方案之外,似乎没有人能够回答为什么 COM 会出现这种行为。

最佳答案

由于 COM 和线程的复杂性以及它们工作方式的原因,恐怕您的问题可能无法用一两句话来概括。但对于初学者来说,这里有一些很好的信息,说明为什么 COM 的行为方式与它在线程下的行为方式相同:

http://msdn.microsoft.com/en-us/library/ms809971.aspx

此外,您应该考虑阅读Win32 上的Python 编程一书。它包含一些有用的信息,可以更深入地了解 COM 线程。 (尽管它已经很老了,但它仍然有用。)

最后,如果您提供的引用资料不清楚,每当您的程序使用线程和 COM 时,您都必须在代码中指出您将在线程中使用 COM:

import pythoncom
import win32com.client

### ... inside the thread function ...
x = win32com.client.Dispatch("someCOMobject")
win32com.CoInitialize()
# com calls here
win32com.CoUninitialize()

这种类型的调用使用所谓的单单元线程。当线程代码本身实例化 COM 对象时,就会发生这种情况。

如果您发现自己在线程代码之外实例化单个 COM 对象(并在线程代码中使用实例化的对象,例如在线程之间传递对 COM 对象的访问权限),则这种类型的 COM 线程称为多线程分离线程:

import sys
sys.coinit_flags = 0

import pythoncom
import win32com.client

# ... outside the thread function ...
x = win32com.client.Dispatch("someCOMobject")

# ... inside the thread function ...
pythoncom.CoInitialize(pythoncom.COINIT_MULTITHREADED)
# com calls here for x
pythoncom.CoUninitialize()

希望这有帮助。

关于python - 如何在 Python 中的单独线程中启动 win32 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21141217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com