Python 3.6.9从父目录导入自定义模块出现ImportError问题咨询
Python 3自定义模块相对导入报错问题解决方案
问题根源
- 相对导入仅在文件作为包的一部分被导入时生效,你直接通过
python calling_module.py运行脚本时,Python会将该文件的__name__属性设为__main__,不会识别其所属的父包结构,因此.、..对应的相对路径无法解析,触发attempted relative import with no known parent package报错。 - Python语法规定
import语句后只能接绝对模块名,不能直接跟./..,因此你尝试的import ..neural_networks、import .neural_networks会直接触发语法错误。 - 你第5种写法可正常运行的原因:直接运行脚本时,Python会自动将脚本所在的
directory目录添加到模块搜索路径sys.path的最优先级,此时import neural_networks导入的是directory目录下的neural_networks.py,而非根目录下的目标文件。
解决方案
方案1:临时调整模块搜索路径(适合小型脚本快速使用)
在calling_module.py最开头添加如下代码,将根目录添加到搜索路径中,如需优先导入根目录的重名模块,可将append改为insert(0, ...)调整搜索优先级:
import os import sys # 获取根目录的绝对路径 root_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 添加到模块搜索路径 sys.path.append(root_path)
添加后即可按需导入:
- 导入根目录下的
neural_networks:import neural_networks as root_nn - 导入
directory下的neural_networks:from directory import neural_networks as local_nn
方案2:以包模块形式运行脚本(符合Python规范的写法)
- 分别在根目录、
directory目录下添加空的__init__.py文件,标记为Python包 - 不要进入
directory目录运行脚本,在根目录下执行如下命令运行:python -m directory.calling_module - 此时相对导入可正常使用:
- 导入根目录下的
neural_networks:from .. import neural_networks - 导入
directory下的neural_networks:from . import neural_networks
- 导入根目录下的
方案3:全局配置搜索路径(适合长期项目)
将项目根目录的绝对路径添加到系统的PYTHONPATH环境变量中,配置完成后无需每次调整sys.path,即可在任意位置直接导入根目录下的模块。
内容的提问来源于stack exchange,提问作者Marte Valerio Falcone
相关产品推荐
相关产品推荐

