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

2024-10-01 17:38:16 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当pyu安装程序试图构建pyu的所有文件时,我无法成功构建pyu的源文件夹。我检查了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文件是非常不够的。必须有一个循环系统来读取文件目录并动态添加这些文件。但是我找不到如何动态添加这些文件。我想没有机会手工添加这么多文件。如果有人知道请分享。在


Tags: 文件py程序文件夹homeosgif图标
2条回答

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

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

在创建可执行文件时,我也遇到了这个问题。因为.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

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

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

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

相关问题 更多 >

    热门问题