Mac OS 上的 Pyinstaller ModuleNotFoundError

时间:2021-01-16 06:39:27

标签: python macos pyinstaller macos-big-sur

我正在尝试使用 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)

如果您需要查看原始数据,我有更多原始数据。

1 个答案:

答案 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 可执行文件会打开并运行,尽管有一个终端窗口,即使我在规范文件中没有指定控制台。