使用pyinstaller构建映像和一些配置文件,如txt和xml文件

时间:2012-01-15 15:34:20

标签: python pyinstaller

在将一些数据文件(如图像和txts)添加到python程序时,我遇到了pyinstaller的问题。例如,我创建了一个带有图标的工具栏,并将它们存储在一个名为images的单独文件夹中。我还有一些txt和xml文件来存储一些配置。这些txt ant xml文件存储在另一个名为data_files的文件夹中。所有py文件都存储在另一个名为source的文件夹中。

当我尝试使用pyinstaller构建此python程序时,pyinstaller可以成功构建所有源文件夹,但无法构建images和data_files文件夹。我检查了pyinstaller的文档,但我找不到任何解决方案。我做了很多谷歌搜索,发现只有this资源有用,但这是一个非常不充分的资源。

我的主要问题是:如何使用pyinstaller构建一个带有单独构建的文件夹(如images和confs)的exe文件?

修改 我找到了解决方案。创建spec文件时,您必须 a.datas 参数。

# -*- mode: python -*-
a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(HOMEPATH,'support/useUnicode.py'), '/home/vmode/Desktop/derlem2/sources/TextSTAT.py'],
             pathex=['/home/pyinstaller'])
a.datas += [("Images/New.gif","/home/vmode/Desktop/derlem2/Images/New.gif","DATA")]
a.datas += [("Images/Open.gif","/home/vmode/Desktop/derlem2/Images/Open.gif","DATA")]
a.datas += [("Images/Column.gif","/home/vmode/Desktop/derlem2/Images/Column.gif","DATA")]
pyz = PYZ(a.pure)
exe = EXE( pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=os.path.join('dist', 'TextSTAT'),
          debug=False,
          strip=False,
          upx=True,
          console=1 )

以上规范代码是为我的项目设计的。正如在这个规范代码中看到的,我已经包含了3个用python程序构建的图标。生成程序时,会有一个嵌入了这些图标的独立可执行文件。

但是,如果我们有这么多文件怎么办?假设我们的程序中有1000个图标可供使用。用手写下spec文件是非常不够的。必须有一个循环系统来读取文件目录并动态添加这些文件。但我找不到如何动态添加这些文件。我认为没有任何机会手动添加这么多文件。如果有人知道请分享。

2 个答案:

答案 0 :(得分:5)

在创建可执行文件时,我也遇到了这个问题。因为.spec文件使用python,所以我的解决方案是glob模块。

imagesList = []
imagesList.append( ('icon.ico', '..\\pathfinder\\icon.ico',  'DATA') )
import glob
allImages = glob.glob('..\\pathfinder\\*.png')
for eachImage in allImages:
    imageParts = eachImage.split('\\')
    imagesList.append( (imageParts[-1], eachImage,  'DATA') )
print imagesList
a.datas += imagesList

关于icon.ico的第2行是分开的,因为它有不同的文件扩展名,因此可以被排除。 '.. \ pathfinder'是我所有程序文件的路径(相对于pyinstaller目录)。 glob在目录中搜索所有.png文件(我有65并且拒绝手动编写它们)并返回它们的列表作为字符串,完整的相对目录完整。为了将它分成文件名列表,我在反斜杠上使用了string.split()。然后,对于每个,向用户创建的列表附加字符串拆分的最后部分(最终只是图像的文件名)和完整路径名的元组。最后,使用所有文件的列表,将其添加到a.datas。

我已通过命令行确认这确实可以正常工作,您可以为任何其他文件扩展名重新复制循环。

不幸的是,即使它似乎正确地拉动和附加文件名,我的可执行文件似乎仍然没有使用文件创建(或者可执行文件无法在其自己的数据中找到文件)并且我仍然需要原始文件图像在同一目录中供它工作;也许我的元组元素排序不正确(因此,如果是这样,你应该相应地调整我的代码)。但是,希望这种动态负载仍然适用于您。 imageParts [-1]表示每个.png的文件名,eachImage表示其完整路径(或相对路径,如果它是在glob中使用的那个)。

答案 1 :(得分:1)

如果所有图像都列在同一目录下,则可以使用树

dict_tree = Tree('/home/vmode/Desktop/derlem2/Images', prefix = 'Images')
a.datas += dict_tree