【问题标题】:How can I add a Python site-package folder (that's not being included) to a PyInstaller spec file?如何将 Python 站点包文件夹(不包括在内)添加到 PyInstaller 规范文件?
【发布时间】:2020-05-01 17:41:41
【问题描述】:

我在使用 PyInstaller 时遇到了包含 python 包的问题,​​尤其是 docxcompose 。这是一个需要在 PyInstaller 目录中导入其站点包文件夹的包。我已经 pip 安装了 docxcompose,它在我的站点包库中,文件夹标记为 docxcompose。我在 PyInstaller 中引用的 python 文件中明确列出了import docxcompose

我正在使用规范文件和 --onedir 方法进行调试,因为我想最终使用 --onefile 进行安装。到目前为止,我已将这些添加到规范文件的分析部分,但没有运气:

hiddenimports=['docxcompose']
pathex=['C:\\Users\\myusername\\AppData\\Local\\Programs\\Python\\Python37\\Lib\\site-packages']

我的 PyInstall 中没有添加 docxcompose 是否有原因?有没有办法在安装过程中强制复制该文件夹?

【问题讨论】:

  • 为什么您认为它没有包含在捆绑包中?如果它是显式导入的,PyInstaller 将自动包含它。 (如果没有,您可以使用 hidden-import 选项,无论如何您已经完成了)。您可以使用特定的错误消息更新您的问题吗? (提示:构建 exe 时使用调试选项)
  • @sytech 我的可执行文件打开了,但是当我运行某个使用 docxcompose 的进程时,exe 崩溃了,它说它找不到包含一些 xml 文件的文件夹 docxcompose。安装后,我在目录中的任何地方都找不到 docxcompose。

标签: python pyinstaller docx


【解决方案1】:

要“手动”添加 docxcompose 文件夹而不是依赖 PyInstaller 搜索,我发现您必须在规范文件的分析部分的“数据”中添加 docxcompose 的站点包文件夹目标。见文本/规范文件:

sample.spec

# -*- mode: python ; coding: utf-8 -*-

import sys
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)
block_cipher = None


a = Analysis(['ape_proposal_generator.py'],
             pathex=['C:\\Users\\myusername\\AppData\\Local\\Programs\\Python\\Python37\\Lib', 'C:\\MyPythonFileDest'],
             binaries=[],
             datas=[(path.join(site_packages,"docxcompose"),
"docxcompose")],
             hiddenimports=['docxcompose'],
             hookspath=[],
             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,
          [],
          exclude_binaries=True,
          name='mypythonfilename',
          debug=True,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          console=True )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               upx_exclude=[],
               name='mypythonfilename')

【讨论】:

    【解决方案2】:

    或者,您可以将 --collect-data "docxcompose" 添加到 pyinstaller 的命令行参数中。

    pyinstaller --collect-data "docxcompose"
    

    【讨论】:

      猜你喜欢
      • 2020-11-25
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多