如何在Python中从父目录导入其他路径下的Python文件?
同根平级目录跨模块导入的正确实现方式
你之前写的导入语句
from .. import folder1.file1.py存在两处不符合Python导入规则的问题:
- 模块导入路径不能附带文件后缀
.py,该写法本身存在语法错误- 路径引用逻辑偏差:
..代表从当前文件位置向上跳转两级父目录,而folder1和folder2是同属MainFolder下的平级子目录;且导入语句的语法逻辑为“从指定包导入指定模块/成员”,不能把完整带层级的文件路径直接作为导入对象写在import后面。
推荐方案:基于项目根路径的绝对导入
标准目录结构如下:
MainFolder/ ├── folder1/ │ └── file1.py └── folder2/ └── file2.py
绝对导入的核心是让Python解释器能将MainFolder识别为全局可搜索的路径,常见实现有两种:
- 将程序启动入口放在MainFolder根目录下运行:比如在MainFolder下新建启动入口文件,从入口调用folder2内file2的逻辑,此时解释器会自动将MainFolder加入系统搜索路径,在file2.py中直接写导入语句即可:
from folder1.file1 import 需要引用的函数/类/变量 - 如果必须直接在folder2目录下运行file2.py,需要在file2.py的所有导入逻辑之前,将MainFolder的路径加入Python搜索列表:
import sys import os # 定位当前file2.py所在目录的上一级路径,也就是MainFolder的绝对路径 project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 将项目根路径插入到搜索列表最前端,避免同名模块被其他路径优先匹配 sys.path.insert(0, project_root) # 完成路径配置后即可正常写绝对导入语句 from folder1.file1 import 需要引用的内容
可选方案:包结构下的相对导入
当整个MainFolder被打包为正式Python包(比如通过可编辑安装的方式注册到Python环境中),可以使用相对导入实现平级目录的模块引用:
- 需保证MainFolder、folder1、folder2满足Python包的识别要求:Python3.3+版本即使没有
__init__.py文件,也会被自动识别为命名空间包,旧版本需要在每个相关目录下添加空的__init__.py文件 - 此时在file2.py中的正确相对导入写法为:
注意:这种写法不能直接在folder2目录下运行file2.py,必须从MainFolder的上一级目录作为运行入口启动程序,否则会触发超出顶级包范围的导入报错from ..folder1.file1 import 需要引用的内容
内容的提问来源于stack exchange,提问作者Kedr
相关产品推荐
相关产品推荐

