Pyinstaller ImportError на собственный модуль - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть два модуля рядом друг с другом в пакете, подобном этому:

main/
|--> __init__.py
|--> somePackageName/
    |--> __init__.py
    |--> module1.py
    |--> module2.py

В модуле module1.py я импортирую module2.py с этим оператором:

from .module1 import *

Когда я запускаю python -m somePackageName.module1, скрипт работает отлично (команда выполняется вне пакета)

Теперь я хочу собрать .exe с pyinstaller. После выполнения pyinstaller module1.spec я получаю сообщение об ошибке:

ImportError: попытка относительного импорта без известного родительского пакета
[15800] Не удалось выполнить сценарий module1

Sidenote : Я получаю ту же ошибку при попытке запустить python module1.py изнутри пакета.
Sidenote2: Нужно ли работать со скрытым импортом и / или дополнительным каталогом-крючками?

Спасибо Вы заранее.

1 Ответ

0 голосов
/ 02 апреля 2020

Относительный импорт работает только внутри пакетов. Из того, что вы описываете, я думаю, что вы конвертируете module1.py в .exe, чтобы он больше не находился внутри пакета.

Вам необходимо сделать следующее:

  • иметь bootstrap модуль вне вашего пакета, который использует ваши возможности пакета
  • вызывать pyinstaller на вашем bootstrap модуле

Это приведет к чему-то вроде:

main/
|--> runme.py
|--> __init__.py
|--> somePackageName/
    |--> __init__.py
    |--> module1.py
    |--> module2.py

Ваш runme.py будет выглядеть следующим образом:

import module1.main
module1.main()

Тогда ваш импорт module1 будет работать правильно.

Следующим шагом является упаковка runme.py в исполняемый файл с помощью pyinstaller. Я только что проверил, он отлично работает.

...