Nau*_*ius 9 python pyinstaller
我使用Pyinstaller创建了一个exe文件.
pyinstaller.exe --onefile --icon='Loco.ico program.py
Run Code Online (Sandbox Code Playgroud)
在程序中,我在我的图中包含一个图像,当我在其文件夹中单独运行程序时,我得到以下内容:
IOError: [Errno 2] No such file or directory: 'Logo.png'
Run Code Online (Sandbox Code Playgroud)
一种解决方案是将图像包含在exe文件夹中,如下面的链接所示:
但是再一次--onefile的全部意义就是拥有它,不需要另外的图像.我认为解决方案可能在这个链接中,但我还没有理解.
使用PyInstaller捆绑数据文件(--onefile)
我的spec文件看起来如下:
# -*- 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')
Run Code Online (Sandbox Code Playgroud)
Rai*_*ann 22
尽管网上有解释,我还是花了几个小时才想出了一个独立的应用程序,它包含多个图像,执行时不会打开控制台窗口,并且仅合并在一个文件中。这是我的解决方案,至少适用于 Mac OS:
第 1 步:更改目录
更改为可执行文件的目录:
cd PATH_OF_YOUR_FILE
Run Code Online (Sandbox Code Playgroud)
确保程序所需的图像也位于包含要使其可执行的 Python 文件的文件夹中。
第 2 步:将代码添加到您的 Python 文件中
将以下内容添加到要使其可执行的 Python 文件中:
import os
def resource_path(relative_path):
try:
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
Run Code Online (Sandbox Code Playgroud)
将文件名替换为resource_path("FILENAME").
例子:
image1 = Image.open("image.png")
# to:
image1 = Image.open(resource_path("image.png"))
Run Code Online (Sandbox Code Playgroud)
第 3 步:创建可执行文件
现在运行以下代码(替换图像名称和文件名):
pyinstaller --onefile --windowed --add-data "picture1.jpeg:." --add-data "picture2.png:." your_file.py
Run Code Online (Sandbox Code Playgroud)
注意:可以添加任意数量的图像。
说明:
--onefile:创建一个单文件捆绑可执行文件。同义词:-F
--windowed:确保执行期间没有打开控制台。同义词:-w和--noconsole
应用程序现在位于该dist目录中,该目录与 Python 文件位于同一目录中。
现在应该可以将其拖到另一台 Mac 上,并在通过 启用后在那里运行它Settings -> Security & Privacy。
我希望这对你有帮助。享受结果,喝杯茶然后坐下来。
Nau*_*ius 11
编辑:
我相信我找到了解决问题的方法.
# -*- 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')
Run Code Online (Sandbox Code Playgroud)
并将以下内容添加到我的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")
Run Code Online (Sandbox Code Playgroud)
小智 11
为此苦苦挣扎。要知道的关键是,对于 --onefile 构建,您的图像将存储在 sys._MEIPASS 文件夹中。
我的 tkinter 应用程序中的这行代码破坏了我的 .exe:
self.wm_iconbitmap("favicon.ico")
Run Code Online (Sandbox Code Playgroud)
为了修复它,我将其替换为:
self.wm_iconbitmap(get_path("favicon.ico"))
Run Code Online (Sandbox Code Playgroud)
其中 get_path() 是我添加到模块中的一个小函数:
def get_path(filename):
if hasattr(sys, "_MEIPASS"):
return os.path.join(sys._MEIPASS, filename)
else:
return filename
Run Code Online (Sandbox Code Playgroud)
对于上下文,我在 CLI 中运行此命令来构建 .exe:
pyinstaller --noconfirm --onefile --windowed --add-data "C:/Users/[...]/favicon.ico;." "C:/Users/[...]/main.py"
Run Code Online (Sandbox Code Playgroud)
注意,这是在 Win10 上运行的。
感谢许多其他 Stack Overflow 贡献者来到这里。
如果您使用的是 Qt Designer,则可以通过创建资源文件并将所需的所有图像(包括 Logo.png)添加到该资源中来实现。
要创建资源文件,您可以按照使用 QT Designer 在 GUI 中插入图像中的步骤进行操作。
将图像插入资源文件后,将 Logo.png 分配给 Window 图标,保存 QtDesigner 界面并使用以下命令转换资源文件:pyrcc4 -py3 resourcetest.qrc -o resourcetest_rc.py
最后,使用--onefile选项创建exe文件。无需编辑规格文件。
这是以下内容的变体: 使用 PyInstaller (--onefile) 捆绑数据文件,并且给出的答案更清晰。
分两行:
base_path = getattr(sys, '_MEIPASS',
'.')+'/'获取“root_path”变量以连接到所有文件的路径。filepath = base_path + filepath