Python使用importlib导入数字命名子目录模块遇导入错误求助
解决Python导入子模块时的模块找不到问题
问题分析
当用importlib导入220_04_070.unicorn时,Python会将220_04_070视为一个包,但unicorn.py里的from common import *属于绝对导入,此时Python仅会在sys.path列出的路径中查找common模块,而220_04_070目录不在默认的sys.path内,因此触发ModuleNotFoundError。但如果改成相对导入from .common import *,又会导致unicorn.py无法独立运行(直接运行时模块身份为__main__,相对导入会报错)。
可行解决方案
方案1:动态修改sys.path,添加子目录路径
在main.py导入模块前,将220_04_070目录的绝对路径加入sys.path,让Python能识别到该目录下的common模块。修改后的main.py代码如下:
import sys import os import importlib # 获取220_04_070目录的绝对路径 sub_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '220_04_070')) if sub_dir not in sys.path: sys.path.append(sub_dir) uc = importlib.import_module('220_04_070.unicorn') cm = importlib.import_module('220_04_070.common') mycorn = uc.unicorn()
此方法无需修改unicorn.py的导入语句,既能保证main.py正常导入,也不影响unicorn.py独立运行(直接运行时220_04_070目录默认在sys.path中)。
方案2:注册已导入的common模块到sys.modules
在220_04_070目录下创建空的__init__.py文件(将其转为Python包),然后在main.py中先导入common模块,再将其注册为sys.modules中的common,这样unicorn.py执行绝对导入时会直接调用已加载的模块:
import sys import importlib # 先导入common模块并注册到sys.modules cm = importlib.import_module('220_04_070.common') sys.modules['common'] = cm # 再导入unicorn模块 uc = importlib.import_module('220_04_070.unicorn') mycorn = uc.unicorn()
方案3:运行时手动指定PYTHONPATH
在终端运行main.py时,临时将220_04_070目录加入PYTHONPATH环境变量:
PYTHONPATH="./220_04_070" python main.py
此方式无需修改任何代码,但每次运行都需要设置环境变量,适合临时测试场景。
内容的提问来源于stack exchange,提问作者hzcodec
相关产品推荐
相关产品推荐

