Почему PyInstaller не видит модули?

Я пытаюсь воспроизвести пример кода pySiril и скомпилировать все это в exe-файл, чтобы можно было свободно распространять свои скрипты для обработки астрофотографии.

from pysiril.siril import Siril
from pysiril.wrapper import Wrapper
from pysiril.addons import Addons

app = Siril(siril_exe='D:\\Programs\\Siril\\bin\\siril-cli.exe')  # Starts pySiril
cmd = Wrapper(app)  # Starts the command wrapper

help(Siril)  # Get help on Siril functions
help(Wrapper)  # Get help on all Wrapper functions
help(Addons)  # Get help on all Addons functions

cmd.help()  # Lists of all commands
cmd.help('bgnoise')  # Get help for bgnoise command

del app
pyinstaller -F main.py

Однако при запуске exe появляется ошибка, что модуль не найден:

Traceback (most recent call last):
  File "main.py", line 1, in <module>
    from pysiril.siril import Siril
  File "PyInstaller\loader\pyimod02_importers.py", line 419, in exec_module
  File "pysiril\siril.py", line 32, in <module>
ModuleNotFoundError: No module named 'changelog'
[1824] Failed to execute script 'main' due to unhandled exception!

Для этого требуется весь существующий импорт в siril.py:

import changelog
import LogMsg
import PipeReader
import PipeWriter
import ThreadSiril
import tools

Я могу установить через журнал изменений pip, а как насчет остального? Их нигде нет... но почему без exe все работает нормально?

Код Github

Обратите внимание, что требования минимального воспроизводимого примера предусматривают включение всего необходимого для воспроизведения проблемы в текст самого вопроса. Ссылки хороши для дополнительного контента, но на вопрос должен быть ответ, а ответы должны быть проверяемыми без них (поэтому ответы по-прежнему имеют смысл, даже если ссылки в вопросе ломаются или за ними меняется содержимое или будущее).

Charles Duffy 30.06.2024 23:50

Что касается вопроса «почему без [pyinstaller] все работает нормально?», я бы предложил немного изучить REPL. После успешного запуска import LogMsg в REPL посмотрите на LogMsg.__file__ и посмотрите, откуда он взялся; осмотрите sys.path и сравните его с исходным состоянием; и т. д. Если вы узнаете, что вам нужно указать pyinstaller искать необычные местоположения sys.path (f/e), то вот и все.

Charles Duffy 30.06.2024 23:51

Однако в качестве отправной точки к странным вещам здесь - как правило, virtualenvs никогда не следует возвращать в качестве кода.

Charles Duffy 30.06.2024 23:53

Кроме того, мне кажется, что это должно быть import pysiril.lib.LogMsg as LogMsg, а не import LogMsg, и для остальных то же самое. Если pysiril исправляет sys.path, чтобы добавить свой каталог lib в качестве записи верхнего уровня... ну, вкратце, этого не должно быть, и его автору(ам) должно быть стыдно за публикацию кода с таким уродливым хаком. .

Charles Duffy 30.06.2024 23:54

@CharlesDuffy, разве репозиторий на GitHub, в котором даже есть готовая виртуальная среда, не является идеальным примером? Или лучше загромождать пост огромным количеством строк, необходимых для воспроизведения проблемы?

Quark-Coder 01.07.2024 00:40

Проблема с виртуальными средами в целом заключается в том, что они непереносимы: нет никакой гарантии, что виртуальная среда, созданная на машине человека А, будет работать на машине человека Б, а на практике очень часто этого не происходит. Вот почему обычно упаковывается код, который при запуске создает и заполняет новое виртуальное окружение в системе получателя (requirements.txt, setup.py, pyproject.toml и т. д. все может быть полезно для этой цели), тогда как упаковка самого виртуального окружения не выполняется.

Charles Duffy 01.07.2024 04:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка в pysiril, даже если ее автор не считает ее таковой: там, где эта библиотека должна ссылаться на содержимое каталога pysiril.lib как pysiril.lib.<thing>, вместо этого она настраивает sys.path для включения каталога lib и пытается просто import <thing> .

Это злоупотребление служебным положением (и pyinstaller по праву не поддерживает это). Соответствующее исправление — изменить pysiril, чтобы он ссылался на элементы, которые он продает в пространстве имен, или (если они существуют как внешние пакеты) правильно регистрировать их как зависимости (с местами установки и т. д.) в setup.py или аналогичном.

То есть код, который выполняется в данный момент import LogMsg, вместо этого должен выполняться import pysiril.lib.LogMsg as LogMsg.

Когда я поменял весь импорт на указанный вами, он начал работать, однако в примере, когда я запускаю через IDE, то help(Siril) и остальные команды работают корректно. Достаточно их запаковать в exe и он начнет писать ошибку, что имя help не определено.

Quark-Coder 01.07.2024 09:44

@CharlesDuffy - Привет, Чарльз, уверен, ты поможешь мне с этой проблемой! stackoverflow.com/questions/78704041/… Надеюсь, у вас все хорошо!

Richard T 04.07.2024 16:30

Вы нашли решение, которое я бы сделал сам :)

Charles Duffy 06.07.2024 21:23

Другие вопросы по теме