Pyinstaller没有拾取树或数据文件

Jos*_*aro 3 python pyinstaller

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

我一遍又一遍地阅读文档,我尝试使用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')]
Run Code Online (Sandbox Code Playgroud)

有什么我想念的吗?

Hub*_*bro 8

这个答案已经很晚了,但是将任意文件添加到PyInstaller构建的方法很清楚:

https://pythonhosted.org/PyInstaller/#adding-files-to-the-bundle

元组中的第一个字符串是文件的路径,第二个字符串是它在构建的包下的路径.换句话说,你的最后一行应如下所示:

a.datas += [("/path/to/my_xml_file.xml", "my_xml_file.xml")]
Run Code Online (Sandbox Code Playgroud)

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

a.datas += [("/path/to/dir", "dir")]
Run Code Online (Sandbox Code Playgroud)

我已经添加了以下文档的相关部分.


将文件添加到Bundle

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

添加数据文件

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

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

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

a = Analysis(...
     datas=[ ('src/README.txt', 'README') ],
     hiddenimports=...
     )
Run Code Online (Sandbox Code Playgroud)

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

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

added_files = [
     ( 'src/README.txt', 'README' )
     ]
a = Analysis(...
     datas= added_files,
     ...
     )
Run Code Online (Sandbox Code Playgroud)

字符串可以使用/\作为路径分隔符.您可以使用"glob"缩写指定输入文件.当输入是多个文件时,输出字符串可以是文件夹的名称.例如,要包含.mp3特定文件夹中的所有文件:

added_files = [
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]
Run Code Online (Sandbox Code Playgroud)

匹配的所有文件/mygame/sfx/*.mp3将被复制到包中并存储在名为的文件夹中sfx.

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

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

added_files = [
         ( '/mygame/data', 'data' ),
         ( '/mygame/sfx/*.mp3', 'sfx' ),
         ( 'src/README.txt', 'README' )
         ]
Run Code Online (Sandbox Code Playgroud)

所有文件/mygame/data将以递归方式复制到data包中指定的文件夹中.

  • 这太奇怪了,它对我不起作用,至少对 onefile 选项不起作用。我需要使用“base_dir = join(sys._MEIPASS)”读取临时目录。然后,我可以归档文件,例如 `os.path.join(base_dir, 'sfx', 'example.mp3')`,否则不包含文件。 (2认同)