从父目录的子目录导入 python 模块

Import a python module from a subdirectory of a parent directory

我有这样的目录结构

dir1/subdir1/module1.py
dir1/subdir2/subdir22/module2.py

假设我将 __init__.py 添加到每个目录和子目录。我想从模块2导入模块1,参考了相关问题并尝试了不同的方法,我找不到解决方案。例如

在模块 2 中,我尝试像

一样导入模块 1
from .... import subdir1.module1
from ....subdir1 import module1

以上两个导入都会抛出语法错误。

这对我有用:

$ mkdir -p dir1/subdir1
$ mkdir -p dir1/subdir2/subdir22
$ touch dir1/{,subdir1,subdir2,subdir2/subdir22}/__init__.py
$ echo 'x = 42' > dir1/subdir1/module1.py
$ echo 'from ...subdir1.module1 import x; print x' > dir1/subdir2/subdir22/module2.py
$ python -m dir1.subdir2.subdir22.module2
42

魔法咒语是

from ...subdir1.module1 import x

虽然

from ...subdir1 import module1

也有效。

即使不在包内或不在默认路径上,以下代码也可以从路径加载模块(这里的模块是 Contemplate 我的引擎),你应该有一个虚拟 __init__.py 该文件夹中的文件:

import imp
ContemplateModulePath = os.path.join(os.path.dirname(__file__), '../src/python/')
try:
    ContemplateFp, ContemplatePath, ContemplateDesc  = imp.find_module('Contemplate', [ContemplateModulePath])
    Contemplate = getattr( imp.load_module('Contemplate', ContemplateFp, ContemplatePath, ContemplateDesc), 'Contemplate' )
except ImportError as exc:
    Contemplate = None
    sys.stderr.write("Error: failed to import module ({})".format(exc))
finally:
    if ContemplateFp: ContemplateFp.close()

if not Contemplate:
    print ('Could not load the Contemplate Engine Module')
    sys.exit(1)
else:    
    print ('Contemplate Engine Module loaded succesfully')

这对我有用,

import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.dirname(path.dirname(path.abspath(__file__))) ) ) )

from dir1.subdir1 import module1