益702 2024-06-08 00:34 采纳率: 100%
浏览 2
已结题

怎么把Pyinstaller打包写好的python代码(里面代码主要是引用xlwings与excel交互)为exe,并在其他电脑上使用

目的:把自己用python写好的代码(代码里卖弄通过引用xlwings与excel交互)使用pyinstaller 打包成exe文件后,在别的电脑使用。
问题:在别的电脑打开直接闪退,什么提示都没有。于是我改用cmd来打开这个exe文件,终于弹出报错代码,但是我不知道问题出在哪里。
.
.
以下代码是py文件里主要与excel交互时的代码段:

import xlwings as xw

book=xw.Book.caller()#获取活动工作簿

sheet2 = book.sheets.active#获取活动工作表

sheet2.range('A1').value='Hi'#将'Hi'写入活动工作表A1单元格

.
.

这个代码是能正常工作的,但是使用使用pyinstaller打包成exe文件后,去另一个电脑上使用打开直接闪退,如果用控制台打开会获得报错信息如下:
.
.

F:\first\open\dist\testone>testone.exe
Traceback (most recent call last):
  File "testone.py", line 353, in <module>
    book=xw.Book.caller()
  File "xlwings\main.py", line 1020, in caller
Exception: Book.caller() must not be called directly. Call through Excel or set a mock caller first with Book.set_mock_caller().
[11240] Failed to execute script 'testone' due to unhandled exception!

我如果想在别的电脑上使用excel调用我的py代码,而不想安装过多的软件,这个打包可执行文件应该如何操作呢?

  • 写回答

2条回答 默认 最新

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

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

    要解决这个问题,你需要确保在打包时包含了所有依赖项,并且正确处理了xlwings的mock caller设置。这里是一个详细的步骤指南:

    1. 安装pywin32库,因为xlwings在Windows环境下需要它来与Excel进行交互。你可以使用pip安装:

      pip install pywin32
      
    2. 使用PyInstaller打包你的Python程序时,确保包含所有的依赖项。你可以通过以下命令来创建一个包含所有依赖的spec文件:

      pyinstaller --name testone --onefile --add-data "path_to_your_excel_file.xlsx;." --additional-hooks-dir=hooks testone.py
      

      注意替换path_to_your_excel_file.xlsx为你实际的Excel文件路径,这里我们假设你的Excel文件就在脚本同一目录下。

    3. 创建一个名为hooks的文件夹(如果尚未存在),然后在这个文件夹内创建一个名为hook-xlwings.py的文件。内容如下:

      from PyInstaller.utils.hooks import collect_data_files
      
      hiddenimports = ['xlwings']
      
      def hook(hook_api):
          hook_api.add_datas(collect_data_files('xlwings'))
      
    4. 在你的主Python脚本(这里是testone.py)中,添加以下代码以设置mock caller,这可以防止在没有Excel运行时引发错误:

      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
      
      # 你的其他代码...
      
    5. 现在再次使用PyInstaller根据之前创建的spec文件打包你的程序:

      pyinstaller --name testone --onefile testone.spec
      
    6. 运行生成的testone.exe应该可以在另一台电脑上正常运行了。如果你仍然遇到问题,可以尝试在命令行中使用--debug=all选项来查看更详细的日志输出,以便找出可能的问题所在。

    按照这些步骤,你应该能够在另一台电脑上成功运行你的Python程序,即使目标电脑上没有安装Excel。注意,虽然xlwings提供了一个mock caller机制,但并不是所有功能都能在模拟环境中完美运行,某些特定的功能可能仍需要实际的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}" 绑定取不到值