Хорошо, сценарий очень прост. У меня есть такая структура файла:
.
├── interface.py
├── pkg
│ ├── __init__.py
│ ├── mod1.py
│ ├── mod2.py
Вот мои условия:
- мод2 нужно импортировать мод1.
- и interface.py, и mod2 должны запускаться независимо как основной скрипт. Если хотите, воспринимайте интерфейс как актуальную программу, а mod2 как внутренний тестер пакета.
Итак, в Python 2 я просто сделал бы import mod1
внутри mod2.py, и оба python2 mod2.py
и python2 interface.py
работали бы как ожидалось.
Тем не менее, и это та часть, которую я менее понимаю, используя Python 3.5.2, если я делаю import mod1
; тогда я могу сделать python3 mod2.py
, но python3 interface.py
выдает: ImportError: No module named 'mod1'
:(
Итак, по-видимому, python 3 предлагает использовать import pkg.mod1
чтобы избежать коллизий со встроенными модулями. Хорошо, если я использую это, я могу сделать python3 interface.py
; но тогда я не могу python3 mod2.py
потому что: ImportError: No module named 'pkg'
Аналогично, если я использую относительный импорт: from. import mod1
from. import mod1
затем python3 interface.py
работает; но mod2.py говорит, что SystemError: Parent module '' not loaded, cannot perform relative import
:( :(
Единственное "решение", которое я нашел, - это зайти в одну папку и python -m pkg.mod2
и тогда оно python -m pkg.mod2
. Но нужно ли добавлять префикс пакета pkg
к каждому импорту в другие модули в этом пакете? Более того, чтобы запустить какие-либо скрипты внутри пакета, нужно ли помнить, чтобы перейти на одну папку вверх и использовать переключатель -m? Это единственный путь?
Я не совсем понимаю. Этот сценарий был довольно прост с Python 2, но выглядит неуклюжим в Python 3.
ОБНОВЛЕНИЕ: я загружаю эти файлы с (называемым выше "решением") рабочим исходным кодом здесь: https://gitlab.com/Akronix/test_python3_packages. Обратите внимание, что мне все еще не нравится это, и он выглядит намного хуже, чем решение python2.
Связанные ТАК вопросы, которые я уже прочитал:
- Python - импортировать пакет в модуль, который находится внутри того же пакета
- Как сделать относительный импорт в Python?
- Абсолютный модуль импорта в той же упаковке
Ссылки по теме: