Хорошо, сценарий очень прост. У меня есть такая структура файла:
.
├── 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?
- Абсолютный модуль импорта в той же упаковке
Ссылки по теме: