首页 > 解决方案 > Pyinstaller,规范,包含不同的文件

问题描述

试图包含脚本中使用的 3 个文件scriptName

  1. JSON 文件。

  2. 驱动文件。

  3. 徽标图标

尝试这样做,--add-data 但此选项适用于非代码使用文件。所以我尝试了spec文件。

##specName.py##

block_cipher = None

added_files = 
         [
         ( 'jsonfile.json', '.D:\\Directory\\jsonfile'), 
         ( 'logo1.ico', '.D:\\Directory\\logo1'),
         ( 'chromedriver.exe', '.D:\\Directory\\chromedriver')
         ]


a = Analysis(['gui.pyw'],
             pathex=['D:\\Pyton\\...\\scriptName'],
             binaries=[],
             datas=added_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          exclude_binaries=True,
          name='MyExcutable.exe',
          debug=False,
          strip=False,
          upx=True,
          console=False, icon='D:\\Pyton\\...\\logo1.ico' )
coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               strip=False,
               upx=True,
               name='gui')

最后--pyi-build specName.spec在制作一个可执行文件之后

pyinstaller.exe --onefile --windowed --icon=logo1.ico scriptName.py

编辑顺便说一句,在脚本上我使用这个函数作为相对路径 -

def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

(它得到了原始路径)

但是exe不起作用。有任何想法吗?

标签: pythonexepyinstaller

解决方案


  1. 我想我pyinstaller像这样直接在规范文件上 调用pyinstaller.exe specName.spec。spec 文件说明了脚本名称,无论是 onefile 等。我猜你上面写的最后一行实际上会生成一个新的 spec 文件。

  2. 据我记得,作为datas参数传递的元组中的第二个元素应该包含一个相对路径(将相对于临时文件夹解释/创建到可执行文件将“自解压”的位置。参见例如here on how to find these files/之后的路径。如果您需要引用外部文件,则应在应用程序的配置/代码中使用直接路径。或者,您可以将其包含在包中并手动将其复制到外部位置(这似乎有点奇怪虽然做)。

  3. 正如 pyinstaller 手册所述,首先在“单一目录”设置中进行调试可能是值得的,包括确保包含所有相关文件,然后才传递到单一文件模式(此时相对简单)


推荐阅读