You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:20:05