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

2023-12-29

因此,我有以下代码片段,它尝试通过 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(使用前将#替换为@)

如何在 Python 中的单独线程中启动 win32 应用程序 的相关文章

  • ResultSet 对象没有属性“find_all”

    当我抓取一个网页时 我总是遇到一个问题 AttributeError ResultSet 对象没有属性 find 您可能将项目列表视为单个项目 当您打算调用 find 时 您是否调用了 find all 谁能告诉我如何解决这个问题 我的代码
  • Ubuntu 上的 Chromedriver:selenium.common.exceptions.SessionNotCreatedException:消息:会话未创建

    我在 AWS EC2 实例 的 Ubuntu 环境中使用 Selenium Chromedriver 时遇到问题 我正在使用 Chromedriver Linux64 版本 wnload chromedriver for Linux wge
  • 当鼠标悬停时使用 matplotlib 注释绘图的线条[重复]

    这个问题在这里已经有答案了 我想在鼠标悬停时在绘图上注释不同的线 这里用点进行相同的操作当鼠标悬停在 matplotlib 中的某个点上时可以显示标签吗 https stackoverflow com questions 7908636 p
  • Python XLWT调整列宽

    XLWT 的易用性给我留下了深刻的印象 但有一件事我还没有弄清楚该怎么做 我正在尝试将某些行调整为显示所有字符所需的最小宽度 换句话说 如果双击单元格之间的分隔线 excel 会做什么 我知道如何将列宽调整为预定量 但我不确定如何确定显示所
  • 如何显示 pymongo.errors.OperationFailure 详细信息?

    写入 MongoDB 时 我在 python 中遇到 pymongo OperationsFailure 除了回溯之外 还有没有办法打印出详细信息或代码属性 另请参阅 http api mongodb org python current
  • Python Turtle 中的 onkeypress() 和 Listen() 问题

    我的一个功能有问题 我使用 Python 3 7 当我尝试使用onkeypress 函数 什么也没有发生 我尝试检查它 但是当我按键时乌龟模块没有反应 我尝试使用 w 键向上移动桨 但这不起作用 以下是我的 py 文件 main py im
  • 来自 yahoo 的 python lxml etree 小程序信息

    雅虎财经更新了他们的网站 我有一个 lxml etree 脚本 用于提取分析师建议 然而现在 分析师的建议已经存在 但只是以图表的形式出现 你可以看到一个例子这一页 https finance yahoo com quote CSX ana
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 对训练和测试数据帧使用相同的标签编码器

    我有 2 个不同的 csv 其中包含训练数据和测试数据 我从这些 train features df 和 test features df 创建了两个不同的数据帧 请注意 测试和训练数据有多个分类列 因此我需要对它们应用 labelEnco
  • 如何有效地找到两个轮廓集之间的所有交点

    我想知道找到两组轮廓线之间所有交点 舍入误差 的最佳方法 哪种方法最好 这是示例 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 500 X Y np
  • 缓存 pandas 数据框的最佳方法?

    昨天 我经历了惨痛的教训 将 pandas 数据帧保存到 csv 以供以后使用是一个坏主意 我有一个包含 130k 条推文的数据框 其中数据框的一行是list的推文 当我将数据保存到 CSV 然后重新加载数据帧时 数据帧的行现在是字符串类型
  • 我可以使用对象(类的实例)作为 Python 中的字典键吗?

    我想使用类实例作为字典键 例如 classinstance class dictionary classinstance hello world Python似乎无法将类作为字典键处理 还是我错了 另外 我可以使用像 classinstan
  • 如何在Python中按天对时间序列数据求和? resample.sum() 没有效果

    我是Python新手 如何根据日期求和数据并绘制结果 我有一个 Series 对象 其数据如下 2017 11 03 07 30 00 NaN 2017 11 03 09 18 00 NaN 2017 11 03 10 00 00 NaN
  • 使用 Cython 扩展模块分发共享库和一些 C 代码

    我正在尝试从大型 C 共享库 libbig so 中获取一些函数 并通过 Cython 将它们公开给 Python 为此 我有一个小 C 文件 small cpp 它为我需要的共享库的功能提供了一个薄包装器 从而可以轻松地通过 Cython
  • 无法通过蓝牙读取心率服务

    我希望创建一个简单的 python 脚本 通过蓝牙从 Polar 传感器读取心率数据 我已经阅读了很多其他帖子 但找不到我能够成功执行的简单内容 我有 Polar 可穿戴设备的设备 MAC 地址 我知道我想要读取的值的服务 UUID HR
  • 使用 Python for PyQt WebEngine 授予对 Cam & Mic 的访问权限

    我正在构建一个从 Python 调用的简单 Web 应用程序 我正在使用下面的代码 加载此页面时 以编程方式授予对摄像头和麦克风的访问权限的最简单方法是什么 我只在网上找到了 C 示例 无法找到在 Python 代码中执行此操作的方法 fr
  • Python Blowfish 加密

    由于我对 Java 的了解不完整 我正在努力将此加密代码转换为 Python 代码 两者应该得到完全相同的结果 帮助将不胜感激 Java函数 import javax crypto Cipher import javax crypto sp
  • 从 NumPy、matplotlib 包导入 python 子模块有什么区别[重复]

    这个问题在这里已经有答案了 当我尝试使用时pyplot from matplotlib import matplotlib print matplotlib pyplot just checking 它给了我AttributeError m
  • 二进制补码扩展 python?

    我想知道是否有一种方法可以像在 Python 中的 C C 中一样使用标准库 最好在位数组上 进行二进制补码符号扩展 C C Example program include
  • pandas 数据帧和聚合中的行明智排序

    我在 pandas dataframe df 中有一个表 col1 col2 count 12 15 3 13 17 5 1 36 4 15 12 7 36 1 4 等等 我想要的是将 12 和 15 和 15 和 12 等计算值视为相同

随机推荐