为什么`from datetime import datetime`在两个文件中导入效果不一致?
相同导入语句在不同文件导入结果不一致的原因分析
这一问题本质是Python的模块查找规则和路径上下文差异导致的,核心原因如下:
- 当前工作目录优先级导致的查找偏差
Python导入模块时,会优先查找当前运行文件所在的目录,再按sys.path的配置顺序查找其他路径。你的两个文件分别在v1/user/和v1/meeting/两个不同目录下,如果两个目录下存在和你导入目标同名的文件/子包,就会优先导入当前目录下的同名内容:比如你写的导入语句是from common import Response,如果v1/user/下有common.py是模块,v1/meeting/下的common/__init__.py里直接导出了Response类,就会出现你遇到的差异。 - 相对导入与绝对导入的规则冲突
如果你的项目没有显式开启绝对导入(未在文件头部加from __future__ import absolute_import),旧版本Python会优先使用相对导入,两个文件所在的目录层级不同,相对导入匹配到的目标自然不一样。 - 包的
__init__.py导出配置不同
如果你导入的是跨包的同名对象,不同层级的__init__.py里配置的导出规则不同,也会导致导入结果差异:比如同一个导入语句,在一个文件路径下命中的__init__.py导出的是模块,另一个路径下命中的__init__.py导出的是类。 - 前置命名空间覆盖
如果其中一个文件在执行导入语句前,已经定义了和导入目标同名的变量、类、函数,或者之前的导入已经覆盖了当前命名空间的同名标识符,也会出现导入结果异常。
排查方法
你可以在两个文件的导入语句前添加以下代码,定位导入目标的实际来源:
import sys # 打印当前文件的模块查找路径顺序,对比差异 print(sys.path) # 打印你导入的对象的实际来源 import 你导入的目标名 print(你导入的目标名.__file__) # 如果导入的是类,打印类所属的模块路径 print(你导入的类名.__module__)
内容的提问来源于stack exchange,提问作者minmax19
相关产品推荐
相关产品推荐

