Pyinstaller不拾取树或数据文件

2022-03-23 00:00:00 python pyinstaller

问题描述

我正在尝试使用pyinstaller:print 'hello world!'生成非常基本的python脚本,并且我正在尝试使数据文件或数据文件目录可供二进制文件使用。

我反复阅读文档,尝试使用1.5、2.0和开发版本2.0构建,尝试使用--onefile和--onedir构建,尝试在OS X和Linux上构建,但由于某种原因,我的.spec文件中的数据文件/树语句似乎被忽略了。

以下是我尝试过的一些.spec文件变体:

coll = COLLECT(exe,
               a.binaries
               [('README','/Users/username/my_little_app/foo','DATA')],
               Tree('/Users/username/my_little_app/foo','foo'),
               Tree('/foo','foo'),
               Tree('my_little_app/foo','foo'),
               [('my_xml_file.xml','my_little_app/partner.xml','DATA')],
               a.zipfiles,
               a.datas,
               strip=None,
               upx=True,
               name=os.path.join('dist', 'my_little_app'))


a.datas += [('my_xml_file.xml', '/Users/username/my_little_app/my_xml_file.xml',  'DATA')]

我是不是遗漏了什么??


解决方案

这个答案太晚了,但是将任意文件添加到PyInstaller构建中的方法有非常清晰的文档记录:

https://pyinstaller.readthedocs.io/en/stable/spec-files.html#adding-files-to-the-bundle

元组中的第一个字符串是文件的路径,第二个字符串是它在构建的包下的路径。换句话说,您的最后一行应该是这样的:

a.datas += [("/path/to/my_xml_file.xml", "my_xml_file.xml")]

您还可以添加完整目录,如下所示:

a.datas += [("/path/to/dir", "dir")]

我已添加下面文档的相关部分。


Adding Files to the Bundle

若要将文件添加到包,请创建描述文件的列表并将其提供给Analysis调用。

Adding Data Files

您提供了一个列表,将文件描述为datas=datas=参数值。数据文件列表是元组列表。每个元组都有两个值,这两个值都必须是字符串:

  • 第一个字符串指定此系统中当前的一个或多个文件。
  • 第二个参数指定运行时捆绑的应用程序中的文件名。

例如,要将单个自述文件添加到单文件夹应用程序,您可以按如下方式修改SPEC文件:

a = Analysis(...
     datas=[ ('src/README.txt', 'README') ],
     hiddenimports=...
     )
您已使datas=参数成为单项列表。该项是一个元组,其中第一个字符串表示现有文件是src/README.txt。此文件将复制到名为README的捆绑包中。

如果在单独的语句中创建添加的文件列表,则规范文件的可读性更好:

added_files = [
     ( 'src/README.txt', 'README' )
     ]
a = Analysis(...
     datas= added_files,
     ...
     )
字符串可以使用/作为路径分隔符。您可以使用";glob";缩写指定输入文件。当输入是多个文件时,输出字符串可以是文件夹的名称。例如,要包含某个文件夹中的所有.mp3文件:

added_files = [
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]

所有与/mygame/sfx/*.mp3匹配的文件都将复制到捆绑包中,并存储在名为sfx的文件夹中。

输入文件或文件夹的路径可以是第一个元组中的绝对路径,也可以是第二个元组中的相对路径。如果它是相对的,则被视为相对于等级库文件的位置。

您还可以包括文件夹的全部内容:

added_files = [
         ( '/mygame/data', 'data' ),
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]

/mygame/data中的所有文件都将递归复制到捆绑包中名为data的文件夹中。

相关文章