Я пытаюсь воспроизвести пример кода 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 все работает нормально?
Что касается вопроса «почему без [pyinstaller] все работает нормально?», я бы предложил немного изучить REPL. После успешного запуска import LogMsg
в REPL посмотрите на LogMsg.__file__
и посмотрите, откуда он взялся; осмотрите sys.path
и сравните его с исходным состоянием; и т. д. Если вы узнаете, что вам нужно указать pyinstaller искать необычные местоположения sys.path (f/e), то вот и все.
Однако в качестве отправной точки к странным вещам здесь - как правило, virtualenvs никогда не следует возвращать в качестве кода.
Кроме того, мне кажется, что это должно быть import pysiril.lib.LogMsg as LogMsg
, а не import LogMsg
, и для остальных то же самое. Если pysiril исправляет sys.path
, чтобы добавить свой каталог lib в качестве записи верхнего уровня... ну, вкратце, этого не должно быть, и его автору(ам) должно быть стыдно за публикацию кода с таким уродливым хаком. .
@CharlesDuffy, разве репозиторий на GitHub, в котором даже есть готовая виртуальная среда, не является идеальным примером? Или лучше загромождать пост огромным количеством строк, необходимых для воспроизведения проблемы?
Проблема с виртуальными средами в целом заключается в том, что они непереносимы: нет никакой гарантии, что виртуальная среда, созданная на машине человека А, будет работать на машине человека Б, а на практике очень часто этого не происходит. Вот почему обычно упаковывается код, который при запуске создает и заполняет новое виртуальное окружение в системе получателя (requirements.txt
, setup.py
, pyproject.toml
и т. д. все может быть полезно для этой цели), тогда как упаковка самого виртуального окружения не выполняется.
Это ошибка в 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
не определено.
@CharlesDuffy - Привет, Чарльз, уверен, ты поможешь мне с этой проблемой! stackoverflow.com/questions/78704041/… Надеюсь, у вас все хорошо!
Вы нашли решение, которое я бы сделал сам :)
Обратите внимание, что требования минимального воспроизводимого примера предусматривают включение всего необходимого для воспроизведения проблемы в текст самого вопроса. Ссылки хороши для дополнительного контента, но на вопрос должен быть ответ, а ответы должны быть проверяемыми без них (поэтому ответы по-прежнему имеют смысл, даже если ссылки в вопросе ломаются или за ними меняется содержимое или будущее).