如何通过相对导入从父目录下数字开头的子目录导入Python模块
问题解决方法
错误原因
- 语法报错的核心原因是Python要求可通过点式导入语法直接引用的包名必须符合标识符命名规范:不能以数字开头,仅可包含字母、数字、下划线。你使用的
01_sub-dir目录名以数字开头,不符合规范,直接写在from ... import语句中会被Python解析为非法的数字字面量,触发报错。 - 你写的导入语句中目录名和实际不符:实际目录名为
01_sub-dir,你的语句中写为01_subdir,缺少横杠,即使命名规范符合也会找不到模块。
解决方案
无需修改现有目录结构,使用importlib动态导入即可实现需求,示例代码如下:
import importlib # 按相对路径导入目标模块,__package__会自动补全当前包的上下文 file01_module = importlib.import_module("..01_sub-dir.file01", __package__) # 从模块中提取需要的my_class类 my_class = getattr(file01_module, "my_class")
注意事项
- 要使用相对导入,不能直接将
file02.py作为入口脚本运行(比如直接执行python file02.py),否则Python会将该文件的__name__设置为__main__,丢失包上下文导致相对导入失效,需要以模块形式运行,示例命令如下:
# 在parent-dir的上级目录下执行 python -m parent-dir.02_sub-dir.file02
- 所有涉及的包目录(
parent-dir、01_sub-dir、02_sub-dir)下需要存在__init__.py文件(可为空文件),Python才会将目录识别为可导入的包。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

