我正在尝试使用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')]
我有什么遗漏吗?
答案 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")]
我已添加以下文档的相关部分。
要将文件添加到捆绑包,您需要创建一个描述文件的列表,并将其提供给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
的文件夹中。
答案 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