Pyinstaller ModuleNotFoundError в Mac OS

Я пытаюсь превратить свою программу Python в приложение с помощью pyinstaller. Это работает безупречно в 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

Когда я нажимаю на приложение или открываю его в терминале, значок на мгновение появляется в доке и исчезает. Больше ничего не происходит. Когда я загружаю исполняемый файл Unix в каталог dist, терминал открывается и дает мне следующее:

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]

Это строка 58 в программе Python:

# 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)

У меня есть еще необработанные данные, если вам нужно их увидеть.


person Thomas Weeks    schedule 16.01.2021    source источник
comment
Приложение .exe?   -  person Devansh Garg    schedule 16.01.2021
comment
В Finder файл идентифицируется как приложение, другой файл идентифицируется как исполняемый файл Unix.   -  person Thomas Weeks    schedule 17.01.2021
comment
Попробуйте добавить скрытый импорт в pillow в вашем файле спецификации, например hiddenimports=['pillow']   -  person AST    schedule 18.01.2021
comment
Я пробовал это. Спасибо, но это не сработало. Единственное, что пока работает, - это добавить папку PIL в тот же каталог, что и файл klusterbox.py. Но я могу запустить программу только с исполняемым файлом Unix. Приложение открывается, а затем сразу закрывается.   -  person Thomas Weeks    schedule 18.01.2021


Ответы (1)


Изменить: позже я узнал, что приведенный ниже метод стал неактуальным, запустив pyinstaller из виртуальной среды. После того, как я удалил pyinstaller с помощью pip uninstall pyinstaller вне виртуальной среды. Я запустил виртуальную среду, а затем установил pyinstaller внутри виртуальной среды с помощью pip install pyinstaller. После этого pyinstaller нашел нужные модули. Конец редактирования.

Это частичный ответ, в котором я смог частично решить проблему. Сначала я зашел в терминал, перешел в папку проекта и убедился, что виртуальная среда запущена:

pipenv shell

Затем я поискал недостающий модуль, который указан в ModuleNotFoundError: Нет модуля с именем «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: [email protected]
License: HPND
Location: /Users/thomasweeks/.local/share/virtualenvs/klusterbox-K4ySO0c7/lib/python3.7/site-packages
Requires: 
Required-by: 

Я скопировал местоположение с терминала и открыл файл klusterbox.spec. У вас будет .spec в папке вашего проекта. Я изменил значение pathex в кортеже анализа в файле .spec.

...
a = Analysis(['klusterbox.py'],
             pathex=['/Users/thomasweeks/.local/share/virtualenvs/klusterbox-K4ySO0c7/lib/python3.7/site-packages', '/Users/thomasweeks/klusterbox/kb_install'],
             binaries=[],
...

Таким образом, значение pathex кортежа Analysis теперь содержит два местоположения: местоположение папки проекта и местоположение пакетов сайта в виртуальной среде. Больше я ничего не менял в файле спецификации.

Я удалил старые папки dist, build и pycache в Finder.

В терминале я повторно запустил pyinstaller, используя файл .spec вместо файла .py. Это запускает pyinstaller, чтобы он был настроен вашим исправленным файлом спецификации.

pyinstaller klusterbox.spec 

Pyinstaller запускается, создает папки dist, build и pycache. В папке dist находятся файл klusterbox (исполняемый файл Unix) и файл klusterbox.app. Файл klusterbox.app по-прежнему не открывается, но исполняемый файл Unix открывается и запускается, хотя есть окно терминала, хотя я не указал консоли в файле спецификации.

person Thomas Weeks    schedule 18.01.2021