我正在尝试使用 pyinstaller 将我的 python 程序变成一个应用程序。这在 Windows 中可以完美运行,但不适用于 Mac OS (Big Sur)。我已经安装了 pyinstaller 版本 5.0dev0。
我启动了虚拟环境并使用以下命令在终端中运行 pyinstaller。 (最终,我想将它作为 --onefile 运行并且没有调试内容):
(klusterbox) thomasweeks@Thomass-MacBook-Pro kb_install % pyinstaller -w -D -i kb_sub/kb_images/kb_icon1.icns --log-level DEBUG > out.txt klusterbox.py
当我点击应用程序或在终端中打开它时,图标会在 Dock 中出现并消失。没有其他事情发生。当我在 dist 目录中的 Unix 可执行文件时,终端打开并给我这个:
Last login: Fri Jan 15 22:24:13 on ttys002
thomasweeks@Thomass-MacBook-Pro ~ % /Users/thomasweeks/klusterbox/kb_install/dist/klusterbox/klusterbox ; exit;
Traceback (most recent call last):
File "klusterbox.py", line 58, in <module>
ModuleNotFoundError: No module named 'PIL'
[24871] Failed to execute script klusterbox
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
这是python程序中的第58行:
# Pillow Library
from PIL import ImageTk, Image # Pillow Library
Pillow 模块安装在虚拟环境中:
(klusterbox) thomasweeks@Thomass-MacBook-Pro klusterbox % pip3 list
Package Version
------------------ --------
...
openpyxl 3.0.3
pdfminer.six 20181108
Pillow 8.0.1
pip 20.3.1
...
我的 .spec 文件如下所示:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['klusterbox.py'],
pathex=['/Users/thomasweeks/klusterbox/kb_install'],
binaries=[],
datas=[],
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,
[],
exclude_binaries=True,
name='klusterbox',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False , icon='kb_sub/kb_images/kb_icon1.icns')
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='klusterbox')
app = BUNDLE(coll,
name='klusterbox.app',
icon='kb_sub/kb_images/kb_icon1.icns',
bundle_identifier=None)
如果您需要查看原始数据,我有更多原始数据。
答案 0 :(得分:0)
编辑:我后来发现通过从虚拟环境内部运行 pyinstaller 使下面的方法变得无关紧要。在我在虚拟环境之外使用“pip uninstall pyinstaller”卸载 pyinstaller 之后。我启动了虚拟环境,然后使用“pip install pyinstaller”在虚拟环境中安装了 pyinstaller。在此之后,pyinstaller 找到了所需的模块。编辑结束。
这是部分答案,我能够解决部分问题。首先,我转到终端,导航到项目文件夹并确保虚拟环境正在运行:
pipenv shell
接下来,我查找了 ModuleNotFoundError: No module named 'PIL' 中引用的缺失模块。
pip show Pillow
这给出了以下报告:
(klusterbox) thomasweeks@Thomass-MacBook-Pro kb_install % pip show Pillow
Name: Pillow
Version: 8.0.1
Summary: Python Imaging Library (Fork)
Home-page: https://python-pillow.org
Author: Alex Clark (PIL Fork Author)
Author-email: aclark@python-pillow.org
License: HPND
Location: /Users/thomasweeks/.local/share/virtualenvs/klusterbox-K4ySO0c7/lib/python3.7/site-packages
Requires:
Required-by:
我从终端复制了该位置并打开了我的 klusterbox.spec 文件。您将在您的项目文件夹中成为 .spec 。我在 .spec 文件中的 Analysis 元组中更改了 pathex 的值。
...
a = Analysis(['klusterbox.py'],
pathex=['/Users/thomasweeks/.local/share/virtualenvs/klusterbox-K4ySO0c7/lib/python3.7/site-packages', '/Users/thomasweeks/klusterbox/kb_install'],
binaries=[],
...
所以分析元组的 pathex 值现在包含两个位置,项目文件夹的位置和虚拟环境中站点包的位置。我没有更改规范文件中的任何其他内容。
我删除了 Finder 中旧的 dist、build 和 pycache 文件夹。
在终端中,我使用 .spec 文件而不是 .py 文件重新运行了 pyinstaller。这将运行 pyinstaller,以便通过您修改后的规范文件对其进行配置。
pyinstaller klusterbox.spec
Pyinstaller 运行,创建 dist、build 和 pycache 文件夹。打开 dist 文件夹有一个 klusterbox 文件(Unix Executable File)和一个 klusterbox.app 文件。 klusterbox.app 文件仍然不会打开,但 Unix 可执行文件会打开并运行,尽管有一个终端窗口,即使我在规范文件中没有指定控制台。