Pyinstaller没有拾取树或数据文件

时间:2013-02-07 19:32:58

标签: python pyinstaller

我正在尝试使用pyinstaller print 'hello world!'构建一个 very 基本python脚本,我正在尝试创建一个数据文件或二进制文件可用的数据文件目录。

我一遍又一遍地阅读文档,我尝试使用1.5,2.0和2.0版本的dev构建,我尝试使用--onefile和--onedir构建,我尝试过构建OS X和Linux,但出于某种原因,我的.spec文件中的datafile / tree语句似乎被忽略了。

以下是我尝试过的一些.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')]

我有什么遗漏吗?

2 个答案:

答案 0 :(得分:8)

这个答案已经很晚了,但是将任意文件添加到PyInstaller构建的方式非常明确:

https://pythonhosted.org/PyInstaller/#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= Analysis参数的值。数据文件列表是元组列表。每个元组都有两个值,两个值都必须是字符串:

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

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

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

您已将datas=参数设为单项列表。该项是一个元组,其中第一个字符串表示现有文件为src/README.txt。此文件将复制到名为README的包中。

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

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的文件夹中。

输入文件或文件夹的路径可以是第一个元组中的绝对路径,也可以是第二个元组中的相对路径。当它是相对的时,它被视为相对于spec文件的位置。

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

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

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

答案 1 :(得分:0)

简单的解释

根据最新的官方文档:Adding Data Files,您的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 adding data files - Stack Overflow