益702 2024-06-08 14:09 采纳率: 100%
浏览 11
已结题

关于python调用comtypes的错误

这个问题发生在我为了打包py文件为可执行代码而新建立的环境中,因为py代码需要与xecel交互,所以听取回复的建议,添加了这个代码段,但是提示我缺少comtypes模块,我明明已经安装了,
.
问题代码段:

import os
import sys
import platform

 
# 检查是否在Windows系统中运行
if platform.system() == "Windows":
    # 设置mock caller
    import win32com.client
    from comtypes.client import GetActiveObject
 
    def mock_get_active_object():
        return GetActiveObject("Excel.Application")
 
    if len(sys.argv) > 1 and sys.argv[1] == "--mock":
        # 如果启动参数包含--mock,则设置mock caller
        xw.App = mock_get_active_object
    else:
        # 否则,检查是否有Excel正在运行
        try:
            app = win32com.client.GetActiveObject("Excel.Application")
        except Exception:
            pass
        else:
            # 如果有Excel运行,使用它作为caller
            xw.App = app
    del mock_get_active_object
 
# 你的其他代码...

.
虽然在VSCode里ctrl + F5运行后没有报错,但是到excel表格里实际调用py代码时就会报错,不知道是什么原因,我又去查了这个环境下的包列表,确实是有comtypes的
.
这是包列表:

(toexe) F:\first\open>conda list
# packages in environment at C:\ProgramData\anaconda3\envs\toexe:
#
# Name                    Version                   Build  Channel
altgraph                  0.17.3           py38haa95532_0
ca-certificates           2024.3.11            haa95532_0
comtypes                  1.1.14           py38haa95532_0
future                    0.18.3           py38haa95532_0
libffi                    3.4.4                hd77b12b_1
openssl                   3.0.13               h2bbff1b_2
pefile                    2022.5.30        py38haa95532_0
pip                       24.0             py38haa95532_0
pyinstaller               5.13.2           py38h2bbff1b_0
pyinstaller-hooks-contrib 2022.14          py38haa95532_0
python                    3.8.19               h1aa4202_0
pywin32                   305              py38h2bbff1b_0
pywin32-ctypes            0.2.2            py38haa95532_0
setuptools                69.5.1           py38haa95532_0
sqlite                    3.45.3               h2bbff1b_0
vc                        14.2                 h2eaa2aa_1
vs2015_runtime            14.29.30133          h43f2093_3
wheel                     0.43.0           py38haa95532_0
xlwings                   0.29.1           py38haa95532_0

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-08 14:09
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试将Python脚本打包成可执行文件,并且在Excel中调用它时遇到了问题。根据你提供的信息,你已经在环境中安装了comtypes模块,但在实际运行时仍然出现了问题。

    首先,确认一下你的Python脚本是如何从Excel中调用的。通常情况下,你会通过VBA宏来调用外部Python脚本。确保你正确地设置了VBA宏,并且路径指向正确的Python可执行文件(比如一个.exe文件)。

    其次,考虑到你在不同环境下运行时的行为差异,可能是由于环境变量或者依赖项加载顺序的问题。你可以尝试以下步骤来解决这个问题:

    1. 确保环境一致:在创建可执行文件时,使用相同的虚拟环境。这意味着你需要在conda环境中运行PyInstaller来打包你的脚本,而不是在全局环境中。这样可以确保所有依赖项都被正确地包含在内。

      在命令行中进入你的conda环境,然后运行PyInstaller:

      conda activate toexe
      pyinstaller your_script.py
      

      这将会生成一个包含所有依赖项的可执行文件,例如dist/your_script.exe

    2. 检查PyInstaller配置:确保在打包时包含了必要的hidden imports。有时,PyInstaller可能不会自动识别所有的隐式导入。对于comtypes,你可以尝试在构建spec文件时明确指定这些隐藏导入。

      首先,创建一个名为your_script.spec的spec文件:

      pyinstaller --name=your_script your_script.py --onefile --add-data "path/to/xlwings/*;." --hidden-import=win32com --hidden-import=comtypes.client
      

      然后,编辑这个spec文件,找到Analysis部分,在那里添加hiddenimports

      a = Analysis(['your_script.py'],
                    pathex=['path/to/your_script'],
                    binaries=[],
                    datas=[('path/to/xlwings/*', '.')],
                    hiddenimports=['win32com', 'comtypes.client'],
                    ...
      

      之后,重新构建你的可执行文件:

      pyinstaller your_script.spec
      
    3. 检查Excel VBA宏:确保你的VBA宏正确引用了Python可执行文件的完整路径。例如,如果你的可执行文件在dist目录下,那么VBA宏可能会类似这样:

      Sub RunPythonScript()
          Dim pythonExe As String
          pythonExe = "C:\Path\To\Your\Anaconda3\envs\toexe\Scripts\your_script.exe"
      
          Shell pythonExe, vbNormalFocus
      End Sub
      

      请确保替换为你的实际路径。

    4. 清理并重新打包:有时候,旧的缓存或者遗留的依赖可能导致问题。尝试删除之前的build和dist目录,然后重新进行上述步骤。

    完成这些步骤后,再次尝试在Excel中运行你的脚本。如果问题依然存在,请提供详细的错误消息,以便我能进一步协助你排查问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月16日
  • 已采纳回答 6月8日
  • 创建了问题 6月8日

悬赏问题

  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值