python openpyxl没有在exe文件中找到用pyinstaller

aor9mmx1  于 2023-01-01  发布在  Python
关注(0)|答案(2)|浏览(424)

我用pip写了一个虚拟evn的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!

我也尝试过通过conda重新安装openpyxl,但是没有任何变化。

pyinstaller --onefile main_new.spec main.py

规格文件为:

# -*- 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 )

我该如何解决这个问题?
谢谢大家!

ep6jt1vc

ep6jt1vc1#

我认为在构建 *. exe时收集openpyxl的所有子模块可能会有所帮助。
请参考此页面或此平台上关于钩子文件的许多答案:https://pyinstaller.org/en/stable/hooks.html#PyInstaller.utils.hooks.collect_submodules

edit:在我的例子中,我这样使用它:

在你的 *.py目录下的hook文件(你想要转换)包含collect_submodules函数(屏幕截图的右边),在 *.spec文件中,hookspath被定义为与你的 *.py相同(屏幕截图的左边)

ctehm74n

ctehm74n2#

这个错误指的是openpyxl里面的“openpyxl.cell._writer”。事实上,pyinstaller实际上能够找到openpyxl。我检查了里面,我发现在pip环境中我使用的是3.0.9版本,而在conda环境中我使用的是3.0.10版本。降级到3.0.9,没有--hidden-import或其他需要的,它只是工作。

相关问题