使用Max和本文中有关添加额外的数据文件(如图像或声音)以及我自己的研究/测试的出色答案,我弄清楚了我认为添加此类文件的最简单方法。
如果你想看到一个活生生的例子,我的仓库是这里 GitHub上。
注意:这是用于在pyinstaller中使用--onefile
or -F
命令进行编译。
我的环境如下。
- Python 3.3.7
- Tkinter 8.6 (检查版)
- Pyinstaller 3.6
分两步解决问题
为了解决该问题,我们需要专门告诉Pyinstaller,我们还有一些其他文件需要与应用程序“捆绑”在一起。
我们还需要使用“相对”路径,因此当应用程序作为Python脚本或Frozen EXE运行时,它可以正常运行。
话虽如此,我们需要一个允许我们拥有相对路径的功能。使用“ 最大发布 ”功能,我们可以轻松解决相对路径。
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
我们将使用上述功能,因此当应用程序以脚本或冻结EXE的形式运行时,应用程序图标就会显示出来。
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
下一步是我们需要指导Pyinstaller在编译时在哪里可以找到多余的文件,以便在运行应用程序时在temp目录中创建它们。
我们可以按照文档中所示的两种方式解决此问题,但是我个人更喜欢管理自己的.spec文件,因此我们将采用这种方式。
首先,您必须已经有一个.spec文件。就我而言,我可以通过运行pyinstaller
额外的args 创建所需的内容,您可以在此处找到额外的args 。因此,我的规格文件可能看起来与您的有些不同,但是在解释了重要内容之后,我将其全部发布以供参考。
add_files本质上是一个包含元组的列表,在我的情况下,我只想添加一个图像,但是您可以使用来添加多个ico,png或jpg,('app/img/*.ico', 'app/img')
也可以创建另一个元组,例如added_files = [ (), (), ()]
具有多个导入
元组的第一部分定义您要添加的文件或文件的类型以及在何处找到它们。认为这是CTRL + C
元组的第二部分告诉Pyinstaller,使其路径为“ app / img /”,并将文件放置在该目录中,与您运行.exe时创建的任何临时目录相对。认为这是CTRL + V
在之下a = Analysis([main...
,我设置了datas=added_files
,最初它曾经是,datas=[]
但是我们想要导入的列表是导入的,所以我们传入自定义导入。
除非您需要EXE的特定图标,否则您无需执行此操作,在spec文件的底部,我告诉Pyinstaller使用option为exe设置我的应用程序图标icon='app\\img\\app_icon.ico'
。
added_files = [
('app/img/app_icon.ico','app/img/')
]
a = Analysis(['main.py'],
pathex=['D:\\Github Repos\\Processes-Killer\\Process Killer'],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Process Killer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True , uac_admin=True, icon='app\\img\\app_icon.ico')
编译为EXE
我很懒。我不喜欢输入太多东西。我创建了一个.bat文件,只需单击即可。您不必这样做,此代码将在没有它的情况下在命令提示符外壳中运行。
由于.spec文件包含我们所有的编译设置和args(aka选项),我们只需要将该.spec文件提供给Pyinstaller。
pyinstaller.exe "Process Killer.spec"
a.datas += ...
)确实对我有所帮助。有关使用pyinstaller文档会谈COLLECT
但未能将文件转换成二进制使用时--onefile