6

我正在尝试使用 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')]

有什么我想念的吗?

4

2 回答 2

12

这个答案已经很晚了,但是将任意文件添加到 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")]

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


将文件添加到捆绑包

要将文件添加到包中,您需要创建一个描述文件的列表并将其提供给Analysis调用。

添加数据文件

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

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

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

a = Analysis(...
     datas=[ ('src/README.txt', 'README') ],
     hiddenimports=...
     )

您已将datas=参数设为单项列表。该项目是一个元组,其中第一个字符串表示现有文件是src/README.txt. 该文件将被复制到具有 name 的包中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包中命名的文件夹中。

于 2015-11-02T13:33:42.287 回答
0

简单解释

根据最新的官方文档:添加数据文件,你的spec文件应该是这样的:

a = Analysis(xxx,
             pathex=xxx,
             binaries=[],
             datas=[
                ('README', '.'),
                ("/Users/username/my_little_app/my_xml_file.xml", "."),
                ('DATA', 'DATA'),

                ('/Users/username/my_little_app/foo', 'foo'),
                ("/path/to/dir", "dir"),
            ],

详细解释

在另一篇文章中参考我的答案:Pyinstaller 添加数据文件 - Thinbug

于 2020-01-13T05:31:54.287 回答