Python Pyinstaller和--onefile:如何在exe文件中包含图像
我使用Pyinstaller创建了一个exe文件Python Pyinstaller和--onefile:如何在exe文件中包含图像,python,pyinstaller,Python,Pyinstaller,我使用Pyinstaller创建了一个exe文件 pyinstaller.exe --onefile --icon='Loco.ico program.py 在该程序中,我在绘图中包括一个图像,当我在其文件夹中单独运行该程序时,我得到以下结果: IOError: [Errno 2] No such file or directory: 'Logo.png' # -*- mode: python -*- a = Analysis(['AMOS_Visualizer.py'], path
pyinstaller.exe --onefile --icon='Loco.ico program.py
在该程序中,我在绘图中包括一个图像,当我在其文件夹中单独运行该程序时,我得到以下结果:
IOError: [Errno 2] No such file or directory: 'Logo.png'
# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='AMOS_Visualizer.exe',
debug=False,
strip=None,
upx=True,
console=True , icon='AMOS.ico')
一种解决方案是将图像包含在exe文件夹中,如下面的链接所示:
但是,再一次强调,一个文件的全部意义就是要有一个完整的文件,而不需要额外的图像。我想解决办法可能就在这个环节上,但我还不明白
我的等级库文件如下所示:
IOError: [Errno 2] No such file or directory: 'Logo.png'
# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='AMOS_Visualizer.exe',
debug=False,
strip=None,
upx=True,
console=True , icon='AMOS.ico')
编辑:
我相信我找到了解决问题的办法
# -*- mode: python -*-
a = Analysis(['AMOS_Visualizer.py'],
pathex=['C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting'],
hiddenimports=[],
hookspath=None,
runtime_hooks=None)
for d in a.datas:
if 'pyconfig' in d[0]:
a.datas.remove(d)
break
a.datas += [('Logo.png','C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\Logo.png', 'Data')]
pyz = PYZ(a.pure)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='AMOS_Visualizer.exe',
debug=False,
strip=None,
upx=True,
console=True, icon='C:\\Users\\elu\\PycharmProjects\\Prosjektet\\Forsok splitting\\AMOS.ico')
并将以下内容添加到我的main.py脚本中
def 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)
Logo = resource_path("Logo.png")
这是以下内容的变体: , 给出的答案更清楚 分为两行:
使用单行
base\u path=getattr(sys,“\u MEIPASS”,
“.”)+“/”
获取要连接到所有
文件的路径然后,
filepath=base\u path+filepath
如果您使用的是Qt Designer,您可以通过创建一个资源文件并将所有需要的图像(包括Logo.png)添加到此资源中来实现 要创建资源文件,可以按照中的步骤操作 将图像插入资源文件后,将Logo.png分配给窗口图标,保存QtDesigner界面,并使用命令转换资源文件:
pyrcc4-py3 resourcetest.qrc-o resourcetest_rc.py
最后,使用--onefile选项创建exe文件。无需编辑spec文件。在“hiddenimports=[]”之前添加“datas=['文件位置']”。行。
在我的情况下,这是有效的
# -*- mode: python -*-
block_cipher = None
a = Analysis(['embed.py'],
pathex=['C:\\Users\\Aravind\\Desktop\\exe'],
binaries=[],
datas=['C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png'],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='embed',
debug=False,
strip=False,
upx=True,
runtime_tmpdir=None,
console=True )
我尝试了很多,但一个小时后就成功了: 当我第一次运行程序文件MilaBild.py时,使用:
pyinstaller -F -w MilaBild.py
它需要创建“.spec”文件,我需要将以下内容添加到该文件中,如上面其他内容所述:
a.datas += [('rosa.png','C:\\Python34\\rosa.png', 'DATA')]
我的图像文件的名称是rosa.png。它与我的程序文件MilaBild.py位于同一目录下
然后,我allso不得不在我的实际程序文件中添加上面coment中提到的部分:
def 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)
然后,我添加了将文件获取到变量的部分,该部分工作正常:
rosa = resource_path("rosa.png")
我做了很多努力,只花了一个小时就完成了。稍后,我将尝试使用两个图像、声音和子目录。但现在是23:45,那将是新的一天,我对这个如此之远、伟大的休息槽感到非常高兴。最后,它比我在各种网页上找到的要简单&这里 1) 当代码作为已编译的可执行文件运行时,可以在代码中指定临时目录中的相对路径:
if getattr(sys, 'frozen', False): # Running as compiled
running_dir = sys._MEIPASS + "/files/" # Same path name than pyinstaller option
else:
running_dir = "./" # Path name when run with Python interpreter
iconFileName = running_dir + "mylogo.ico"
if os.path.isfile(iconFileName):
root.iconbitmap(iconFileName) # Exemple for tkinter usage
2) 您可以在编译器选项中为文件存储位置创建的临时目录中提供路径:
pyinstaller --onefile --add-binary "mylogo.ico;files" -i mylogo.ico myMainPrg.py
这样,您就不必知道文件在开发中的完整路径,也不必知道将在生产中安装这些文件的完整路径。无需担心。我也有同样的问题,只是这样做就得到了答案。。。
复制我的所有图像,并将它们粘贴到pyinstaller创建的dist/和build/目录中,问题就解决了。:) 为此而挣扎。要知道的关键是,对于--onefile构建,您的图像将存储在sys.\u MEIPASS文件夹中 我的tkinter应用程序中的这行代码正在破坏我的.exe:
self.wm_iconbitmap("favicon.ico")
为了修复它,我将其替换为以下内容:
self.wm_iconbitmap(get_path("favicon.ico"))
其中get_path()是我添加到模块中的一个小函数:
def get_path(filename):
if hasattr(sys, "_MEIPASS"):
return f'{os.path.join(sys._MEIPASS, filename)}'
else:
return f'{filename}'
对于上下文,我在CLI中运行此命令以生成.exe:
pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/[...]/favicon.ico;." "C:/Users/[...]/main.py"
注意,在Win10上运行了这个
多亏了许多其他堆栈溢出贡献者,才得以实现此目的。如果您认为它是重复的,只需将其标记为重复即可。无需在此处重写答案。我认为您需要使用元组
datas=[('C:\\Users\\Aravind\\Desktop\\exe\\dist\\map.png','.')],
并且您还需要使用pyi-makespec--onefile file file.py,首先编辑.spec文件以包含上述内容,然后构建pysintaller--options myfile.spec