代码之家  ›  专栏  ›  技术社区  ›  jqwha

使用pyinstaller包含多个数据文件

  •  7
  • jqwha  · 技术社区  · 6 年前

    我需要在pyinstaller“onefile”可执行文件中包含一个DLL和一个文本文件。我可以只添加DLL,但如果我尝试同时指定这两个文件,pyinstaller会抱怨。我宁愿使用命令行选项(而不是spec文件)-多个文件的正确格式是什么?

    http://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-data-files

    http://pyinstaller.readthedocs.io/en/stable/usage.html#options-group-what-to-bundle-where-to-search

    尝试了一些事情,例如。 pyinstaller:错误:参数--添加数据:无效的add\u data\u或\u二进制值:“%C/path1/my”。dll/c/path2/my。txt;'

    3 回复  |  直到 6 年前
        1
  •  9
  •   jqwha    6 年前

    答案是 https://media.readthedocs.org/pdf/pyinstaller/cross-compiling/pyinstaller.pdf 这表明我可以简单地多次使用--add data选项!

        2
  •  8
  •   Nima Mousavi    6 年前

    我不知道命令行需要哪种语法,但您 可以编辑生成的等级库以包含数据路径,其中数据为 元组列表。

    datas = [('/path/to/file', '/path/in/bundle').
              (...) ]
    

    因此,规范可能如下所示:

    a = Analysis(['Frequency_Analysis_DataInput_Animation_cge.py'],
                 pathex=['C:\\Users\\mousavin\\Documents\\Analysis'],
                 binaries=[],
                 datas=[('/path/file1', '.'), (/path/file2, '.')],
    ...
    

    然后使用

    pyinstaller script.spec
    
        3
  •  1
  •   Adrian Mole Khaled Ali    3 年前

    为了使用pyinstaller将多个文件的数据添加到EXE文件中,最好的方法是将文件列表添加到应用程序的规范文件中。

    import glob
    
    a = Analysis(['application.py'],
             pathex=['D:\\MyApplication'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
    
    a.datas += [("assets\\"+file.split("\\")[-1], file, "DATA") for file in glob.glob("D:\\MyApplication\\assets\\*")]
    
    pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
    exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='MyApplication',
          debug=True,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )
    

    基本上,glob读取资产文件中的所有文件,在这里,我只是使用列表理解来附加要包含的所有文件

    a.datas += [("assets\\"+file.split("\\")[-1], file, "DATA") for file in glob.glob("D:\\MyApplication\\assets\\*")]
    

    此行将资产文件夹中的所有文件添加到应用程序的资产文件夹中。

    这个解决方案对我有效。