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