在使用 pyinstaller 生成的 exe 文件中找不到 openpyxl

Fra*_*ico 2 python exe pyinstaller openpyxl geopandas

我使用虚拟 evn 和 pip 编写了一个 Python 代码,并使用 pyinstaller 构建它以将其用作可执行文件,并且它可以工作。现在我要转移到 conda 环境来使用 geopandas、fiona 和 gdal。我可以运行它而不会出现任何错误,但是如果我将代码构建到 .exe 中,则会引发此错误:

Traceback (most recent call last):
  File "main.py", line 5, in <module>
  File "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_module
  File "openpyxl\__init__.py", line 6, in <module>
  File "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_module
  File "openpyxl\workbook\__init__.py", line 4, in <module>
  File "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_module
  File "openpyxl\workbook\workbook.py", line 9, in <module>
  File "PyInstaller\loader\pyimod03_importers.py", line 495, in exec_module
  File "openpyxl\worksheet\_write_only.py", line 13, in <module>
  File "openpyxl\worksheet\_writer.py", line 23, in init openpyxl.worksheet._writer
ModuleNotFoundError: No module named 'openpyxl.cell._writer'
[12248] Failed to execute script 'main' due to unhandled exception!
Run Code Online (Sandbox Code Playgroud)

我还尝试通过 conda 重新安装 openpyxl,但没有任何改变。构建的命令行是:

pyinstaller --onefile main_new.spec main.py
Run Code Online (Sandbox Code Playgroud)

规格文件是:

# -*- mode: python ; coding: utf-8 -*-
block_cipher = None

a = Analysis(['main.py'],
             pathex=[],
             binaries=[],
             datas=[('./inputs/*.csv', 'inputs')],
             hiddenimports=[
             'openpyxl',
             'xlrd',
             'xlswriter'
             ],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
         cipher=block_cipher)

exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='DESAT',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True,
          disable_windowed_traceback=False,
          target_arch=None,
          codesign_identity=None,
          entitlements_file=None )
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

谢谢你!

小智 5

显式导入模块就可以了。可以从命令行导入,也可以通过修改.spec文件导入。

命令行模式:

pyinstaller main.py --hidden-import openpyxl.cell._writer

注意:模块名称不需要用引号引起来

修改.spec方式:

a = Analysis(
...
    hiddenimports=['openpyxl.cell._writer'],
...
)
Run Code Online (Sandbox Code Playgroud)