目录a/b/c.py
d/e/f.py
f该如何引入c中的对象
在给出的目录结构下:
text
project_root/
├── a/
│ └── b/
│ └── c.py
└── d/
└── e/
└── f.py
f.针对 py 而言, 要是打算引入 c.py 里的对象, 可选方式存在好几种, 具体选择哪些方式须视你的项目结构情况, 以及你期望怎样去组织那代码而定。
方法一:使用绝对导入(推荐)
前提: a目录得是包(也就是说要包含.py文件), 或者, 该目录必须处于模块搜索路径里(像通过设置实现, 或借助sys.path添加达成), d目录同样如此, 要么是包包含.py文件, 要么得在模块搜索路径中, 通过设置或者用sys.path添加。
目录结构:
text
project_root/
├── __init__.py
├── a/
│ └── b/
│ ├── __init__.py
│ └── c.py
└── d/
└── e/
├── __init__.py
└── f.py
在 f.py 中:
text
from a.b.c import SomeObject # 假设 c.py 中定义了 SomeObject
方法二:使用相对导入(不推荐)

通过文件系统里的相对位置来进行相对导入,一般不大建议用于跨目录的导入情形, 因为这样有可能致使代码在维护以及移植方面比较困难。
在 f.py 中:
text
from ...a.b.c import SomeObject # 三个点表示从当前文件向上三级
请注意, 相对导入的语法当中, 那表示向上三级目录的这种情况, 然而此方式在实际运用的时候极易出现错误, 并且它还依赖于文件系统的层次结构。
方法三:动态修改 sys.path
要是a以及d并非包, 又或者你并不打算运用包结构, 那么能够借由动态地对sys.path加以修改从而实现导入。
在 f.py 中:
text
import sys
import os
# 获取项目根目录
project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
# 将项目根目录添加到 sys.path
sys.path.insert(0, project_root)
# 现在可以导入 c.py 中的对象
from a.b.c import SomeObject
总结
推荐使用:
要是保证a目录以及它的子目录, 还有d目录以及它的子目录里都存有.py文件, 之后于f.py里采用绝对导入:
text
from a.b.c import SomeObject