
Python不允许模块名以数字开头,因此from 022 import *会触发语法错误;正确做法是重命名模块为合法标识符(如day022.py),或使用importlib.util动态加载非标准命名的模块文件。
python不允许模块名以数字开头,因此`from 022 import *`会触发语法错误;正确做法是重命名模块为合法标识符(如`day022.py`),或使用`importlib.util`动态加载非标准命名的模块文件。
在Python中,模块名本质上是标识符(identifier),必须遵循Python变量命名规则:必须以字母(a–z, A–Z)或下划线(_)开头,后续可跟字母、数字或下划线。因此,文件名 022.py 虽然在操作系统层面合法,但无法通过常规 import 语句直接导入——因为 from 022 import * 中的 022 会被Python解析器误判为数字字面量(带前导零的十进制整数),而Python自3.0起已禁止此类写法(报错 SyntaxError: leading zeros in decimal integer literals are not permitted)。
✅ 推荐方案:重命名模块(最佳实践)
将 022.py 改为符合规范的名称,例如:
-
day022.py -
lesson_022.py -
_022.py(以下划线开头,虽合法但不推荐用于公共模块)
修改后,main.py 可安全使用标准导入:
# main.py
from day022 import * # ✅ 合法且清晰
print("Hello from main.py")
⚠️ 替代方案:动态导入(仅限无法重命名时)
若因外部约束(如自动生成脚本、遗留系统)必须保留 022.py,可借助 importlib.util 绕过语法限制:
# main.py
import importlib.util
module_name = "022"
module_path = "./022.py" # 注意:路径需为实际相对/绝对路径
spec = importlib.util.spec_from_file_location(module_name, module_path)
if spec is None:
raise ImportError(f"Could not load spec for module '{module_name}' from {module_path}")
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
# 此时 module 对象已加载,其全局作用域代码(如 print("Hello World"))已执行
# 如需访问其中定义的变量/函数,可通过 module.xxx 访问
? 注意事项:
- 动态导入不会将模块注入全局命名空间,需显式通过
module.xxx访问内容; -
spec_from_file_location()返回None表示路径无效,请务必检查文件是否存在、路径是否正确; - 避免在生产环境频繁使用动态导入——它削弱静态分析、IDE支持和可读性;
- 模块内顶层代码(如
022.py中的print("Hello World"))会在exec_module()时立即执行。
总结:命名合规是Python模块系统的基础前提。优先通过重命名解决根本问题;动态导入仅作为临时技术兜底,不应成为常规开发模式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











