Я бы использовал __init__.py
, просто пустой файл, который преобразует папки в модули:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
subpackage2_1/
__init___.py
deep_module.py
module_test.py
Это позволит (в module_test.py
)
from package.subpackage2.subpackage2_1 import deep_module
Если deep_moduleимеет класс Foo
# deep_module.py
class Foo: pass
Мы можем импортировать Foo как
from package.subpackage2.subpackage2_1.deep_module import Foo
Я бы не рекомендовал этот тип импорта, так как его сложно отладить.
Вы можете сделать:
from package.subpackage2.subpackage2_1 import deep_module
# it helps to know where class is coming from
foo = deep_module.Foo()
Что лучше, чем импортировать Foo напрямую, но все же я всегда буду стараться избегать его для удобства чтения;)
Если вызовпроизводится в директории пакета, затем
from subpackage2.subpackage2_1 import deep_module
или эта, которая будет работать везде
# terrible hack is to add your package to your sys path
import sys
sys.path.insert(0,'path_to_package')
from package.subpackage2.subpackage2_1 import deep_module