Импорт другого модуля из другого подкаталога родительского каталога текущего каталога (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__ Ключевое слово, если вам действительно нужно, но это может быть немного сложнее.

Другие вопросы по тегам