You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从子包间接导入时出现ModuleNotFoundError: No module named 'utils'

解决相对导入时的ModuleNotFoundError问题

这个问题的核心在于Python导入模块时的路径查找逻辑

当你直接运行account_test.py时,Python会自动把这个脚本所在的目录添加到sys.path(Python查找模块的路径列表)里,所以from utils import account_tester这种绝对导入能正常找到同目录的utils.py

但当你从new_account_test.pyfrom .. import account_test相对导入account_test时,account_test是作为一个模块被导入的,此时它所在的目录并不会自动加入sys.path,所以Python找不到名为utils的模块(因为sys.path里没有它的目录)。

下面是几种可行的解决方案:

方案一:使用相对导入修改account_test.py的导入语句

account_test.py里的导入代码改成相对导入,明确指定从当前包(同目录)导入utils

from .utils import account_tester

这样不管account_test是被直接运行(注意要以模块方式运行)还是被相对导入,都能正确找到utils.py

注意:如果要直接运行account_test.py,不能用python account_test.py,而要在它的父目录下用模块方式启动:

python -m your_package.account_test

(把your_package换成account_test.py所在目录的名称,同时确保该目录下有__init__.py文件,哪怕是空的)

方案二:手动将account_test所在目录加入sys.path

account_test.py的开头添加以下代码,强制把脚本所在目录加入Python的模块查找路径:

import sys
from pathlib import Path

# 获取当前脚本所在的目录
current_dir = Path(__file__).parent
# 把目录加入sys.path
sys.path.append(str(current_dir))

这种方法比较直接,不需要修改导入语句的写法,也不影响直接运行脚本的方式,但属于“hack式”的解决方案,适合快速调试场景。

方案三:将项目组织为标准包结构(推荐)

把你的项目整理成标准的Python包结构,确保所有模块都能通过绝对导入访问:

  1. account_test.pyutils.py所在的目录下创建一个空的__init__.py文件,把这个目录变成一个Python包(比如叫test_pkg)。
  2. 修改account_test.py里的导入语句为绝对导入:
    from test_pkg.utils import account_tester
    
  3. 确保test_pkg的父目录在sys.path里(可以通过设置环境变量PYTHONPATH,或者用pip install -e .把项目安装为可编辑包)。

这种方式是最规范的,适合长期维护的项目,能避免各种导入路径问题。

内容的提问来源于stack exchange,提问作者Jorjani

火山引擎 最新活动