Pyinstaller未识别树文件或数据文件
我正在尝试用pyinstaller制作一个非常简单的python脚本,内容是:print 'hello world!'
,我想把一个数据文件或者一个数据文件夹包含到这个可执行文件里。
我反复阅读了相关文档,尝试过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')]
我是不是漏掉了什么呢??
2 个回答
简单解释
根据最新的官方文档:添加数据文件,你的 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 添加数据文件 - Stack Overflow
这个回答虽然有点晚了,但关于如何将任意文件添加到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文件添加到一个单文件的应用中,你可以这样修改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
的文件夹中。