Python 3.6模块导入遇ModuleNotFoundError及ImportError问题求助
解决Python导入config模块的问题
看起来你在处理模块导入时遇到了相对导入失败的问题,还可能存在属性访问的错误,我来帮你一步步梳理解决:
首先先明确你的文件结构和代码情况,方便精准分析:
你的文件结构
test/ ├── config.py └── test.py
config.py代码
class Config: def __init__(self, name): self.name = name
test.py代码(补全你未写完的部分)
try: # Trying to find module in the parent package from . import config print(config.debug) del config except ImportError: print('Relative import failed') try: # Trying to find module on sys.path import config print(config.debug) except ImportError: print('Absolute import failed')
问题拆解
相对导入失败的核心原因:
当你直接运行python test.py时,Python会把这个脚本当作顶层执行脚本(此时脚本的__name__为__main__),而非某个Python包的子模块。相对导入(from . import ...)仅适用于包内部的模块交互,没有包上下文的情况下必然失败。属性访问的隐藏错误:
你的config.py里只定义了Config类,并没有debug这个模块级变量,哪怕导入成功,print(config.debug)也会抛出AttributeError。
解决方案
第一步:修正config.py的内容
先补充你要访问的debug变量(或者调整为你实际需要访问的内容):
# 添加模块级的debug变量 debug = True class Config: def __init__(self, name): self.name = name
第二步:选择合适的导入方式
方式1:把test当作Python包运行(推荐)
这是符合Python包规范的标准做法:
- 在
test文件夹中创建一个空的__init__.py文件(Python 3.3+可以省略,但加上更符合传统包规范),让Python识别它为一个合法包。 - 切换到
test文件夹的父目录(即包含test文件夹的那个目录),运行命令:
此时Python会把python -m test.testtest当作包,test.py作为包内模块运行,相对导入from . import config就能正常生效,也能顺利访问config.debug。
方式2:直接运行test.py时调整导入逻辑
如果你坚持要直接运行test.py(比如cd test && python test.py),可以修改test.py,去掉相对导入的尝试,或者手动调整Python的搜索路径来支持绝对导入:
import sys from pathlib import Path # 将当前脚本所在目录加入Python的模块搜索路径 sys.path.append(str(Path(__file__).parent)) try: import config print(config.debug) except ImportError: print('Absolute import failed')
这种方式下,绝对导入能成功找到config.py模块,因为我们把当前目录加入了sys.path。
额外提示
- 尽量避免在直接运行的脚本中使用相对导入,相对导入是为包内模块间共享代码设计的。
- 如果你的项目是大型工程,建议用
setup.py或pyproject.toml管理包结构,导入逻辑会更清晰规范。
内容的提问来源于stack exchange,提问作者Jake Bourne
相关产品推荐
相关产品推荐

