因此,我有以下代码片段,它尝试通过 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 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()
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)