Нет модуля с именем ‘gi’ после сборки однопользовательского исполняемого файла с помощью PyInstaller

Вопрос или проблема

Я пытаюсь собрать свой скрипт, написанный на 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. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью в сообщество разработчиков или к официальной документации.

Оцените материал
Добавить комментарий

Капча загружается...