Импорт другого модуля из другого подкаталога родительского каталога текущего каталога (python)
Я пытаюсь написать игру. Поэтому у меня много разных типов кода и я хочу расположить их в полезной иерархии.
Я посмотрел на решения, которые включают размещение __init__.py
в каждой папке, но я все еще несколько сбит с толку, хотя и не так сильно, как интерпретатор Python.
Теперь предположим resource1.py
хочет импортировать функцию из physics1.py
или вообще любой другой .py
файл в Game
каталог, как бы я поступил так?
я пробовал from bin.physics.physics1 import function
но очевидно, что это не работает.
Спасибо за вашу помощь.
/Game
launcher.py
/bin
game.py
__init__.py
/physics
__init__.py
physics1.py
physics2.py
/resources
__init__.py
resource1.py
1 ответ
Это невозможно с обычным механизмом импорта, если вы не сделаете Game
пакет (то есть, поставив __init__.py
внутри Game
каталог). Система относительного импорта python работает только внутри пакетов. Это не общая система обращения к произвольным модулям по их расположению в структуре каталогов. Если вы сделаете Game пакетом, то вы можете сделать from ..bin.physics.physics1 import function
,
Изменить: Обратите внимание, что относительный импорт не работает из сценария, выполняемого в качестве основной программы. Если вы попытаетесь запустить resource.py
напрямую, и он использует относительный импорт, вы получите ошибку "относительный импорт предпринят не в пакете". Это будет работать, если вы импортируете ресурс из другого модуля. Это связано с тем, что система относительного импорта основана на "имени" исполняемого модуля, а когда вы запускаете скрипт напрямую, его имя __main__
вместо того, что бы оно обычно называлось. Это можно обойти, используя __package__
Ключевое слово, если вам действительно нужно, но это может быть немного сложнее.