Вопрос или проблема
Я пытаюсь собрать свой скрипт, написанный на Python, в единый исполняемый файл. Когда я использовал pyinstaller -F script.py
на своем компьютере, это сработало. Но когда я пытаюсь собрать исполняемый файл с помощью GitHub Workflows, после загрузки сгенерированного бинарного файла я получил:
Traceback (most recent call last):
File "script.py", line 3, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 384, in exec_module
File "pydbus/__init__.py", line 1, in <module>
File "PyInstaller/loader/pyimod02_importers.py", line 384, in exec_module
File "pydbus/bus.py", line 1, in <module>
ModuleNotFoundError: No module named 'gi'
[PYI-11218:ERROR] Failed to execute script 'script' due to unhandled exception!
pydbus
нужен gi
(GObject) для работы, однако я проверил на рабочем процессе, установлено ли оно, и apt
вернул мне, что пакет python3-gi
установлен и актуален.
Перед сборкой, конечно, я обновил pip, установил зависимости из requirements.txt
и установил сам pyinstaller
.
Вот фрагмент моего рабочего процесса:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 💾 Установить Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
architecture: 'x64'
- name: 💾 Обновить pip
run: python -m pip install --upgrade pip
- name: 💾 Установить зависимости
run: python -m pip install -r requirements.txt
- name: 💾 Установить pyinstaller
run: python -m pip install -U pyinstaller
- name: 🔨 Собрать исполняемый файл
run: pyinstaller -F script.py
Я действительно не знаю, что мне с этим делать. Заранее спасибо за любую помощь.
Это происходит потому, что PyInstaller не автоматически включает системные библиотеки, установленные при упаковке вашего скрипта на Python. Вы можете явно добавить это, используя опцию --hidden-import
, так что ваша команда запуска будет:
run: pyinstaller -F --hidden-import=gi script.py
Или вы можете использовать пользовательский хук.
Ответ или решение
Решение проблемы: No module named ‘gi’ после сборки однофайлового исполняемого файла с помощью PyInstaller
Ошибка ModuleNotFoundError: No module named 'gi'
, возникающая при выполнении вашего скомпилированного с помощью PyInstaller скрипта, указывает на то, что библиотека gi
(GObject Introspection) не была включена в сборку. Несмотря на то, что вы установили пакет python3-gi
в вашей среде GitHub Workflow, PyInstaller не улавливает системные библиотеки по умолчанию. Ниже приведены шаги, которые помогут вам без проблем собрать исполняемый файл.
1. Использование флага --hidden-import
Одним из простых решений является использование опции --hidden-import
. Эта опция позволяет явно указать PyInstaller, какие модули включать в сборку. В вашем случае команда должна выглядеть следующим образом:
pyinstaller -F --hidden-import=gi script.py
Это гарантирует, что PyInstaller будет учитывать библиотеку gi
при создании исполняемого файла.
2. Создание пользовательского хука
Если библиотек, подобных gi
, будет несколько, и вы планируете их использовать в дальнейшем, возможно, стоит рассмотреть создание пользовательского хука. Хук позволяет вам управлять процессом сборки более гибко.
Создайте файл hook-gi.py
в папке с вашим скриптом и добавьте в него следующий код:
from PyInstaller.utils.hooks import collect_all
hidden_imports = collect_all('gi')
Затем в вашей команде сборки укажите каталог с хуками:
pyinstaller -F --additional-hooks-dir=. script.py
3. Проверка зависимостей
Убедитесь, что все зависимости правильно указаны в вашем requirements.txt
. Иногда проблема может быть связана с тем, что версия pydbus
или других библиотек несовместима с вашей средой выполнения Python или с используемыми библиотеками. Запустите следующие команды в вашей среде, чтобы убедиться в отсутствии проблем с зависимостями:
pip check
4. Логирование
Чтобы получить больше информации о процессе сборки и возникающих ошибках, вы можете включить режим логирования, выполняя команду сборки с флагом --log-level=DEBUG
:
pyinstaller -F --log-level=DEBUG script.py
Это позволит вам увидеть подробные сообщения об ошибках, что может помочь в диагностике проблемы.
5. Полный фрагмент GitHub Workflow
Ваш файл .yml
в GitHub Workflows может выглядеть следующим образом, учитывая вышеуказанные изменения:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 💾 Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
architecture: 'x64'
- name: 💾 Upgrade pip
run: python -m pip install --upgrade pip
- name: 💾 Install dependencies
run: python -m pip install -r requirements.txt
- name: 💾 Install pyinstaller
run: python -m pip install -U pyinstaller
- name: 🔨 Build executable
run: pyinstaller -F --hidden-import=gi script.py
Заключение
Следуя данным рекомендациям, вы сможете успешно собрать однофайловый исполняемый файл вашего скрипта с использованием PyInstaller. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью в сообщество разработчиков или к официальной документации.