Python如何从子目录导入模块 解决No module named 'src'报错
问题背景

需要在examples/borrow.py中导入以下内容:
- 从
src/v1/lend/borrow.py导入函数:prepareAddEscrowTransactions、prepareBorrowTransactions、prepareRepayTransaction - 从
src/v1/lend/costants/testnetCostants.py导入常量:TestnetOracle、TestnetReserveAddress、TestnetTokenPairs - 从
config模块导入对象:algodClient、sender
使用如下导入语句运行时抛出错误:
from src.v1.lend.borrow import prepareAddEscrowTransactions, prepareBorrowTransactions, prepareRepayTransaction from src.v1.lend.costants.testnetCostants import TestnetOracle, TestnetReserveAddress, TestnetTokenPairs from config import algodClient, sender
报错信息:
ModuleNotFoundError: No module named 'src'
报错原因
Python导入模块时的搜索路径默认包含三类:当前执行脚本的所在目录、PYTHONPATH环境变量指定的路径、Python安装目录的默认包路径。
直接运行examples/borrow.py时,解释器的搜索路径仅覆盖examples/目录,无法识别同级的src目录和根目录下的config模块,因此触发模块找不到的错误。
解决方法
二选一即可:
方法1:脚本内动态添加项目根目录到搜索路径(适合单脚本快速调试)
在examples/borrow.py的最开头,所有业务导入语句之前,添加如下代码,将项目根目录注入Python搜索路径:
import sys from pathlib import Path # 当前文件的上一级目录即为项目根目录(src、config.py所在层级) PROJECT_ROOT = Path(__file__).parent.parent.resolve() sys.path.append(str(PROJECT_ROOT)) # 原有导入语句无需修改,直接放在后面即可 from src.v1.lend.borrow import prepareAddEscrowTransactions, prepareBorrowTransactions, prepareRepayTransaction from src.v1.lend.costants.testnetCostants import TestnetOracle, TestnetReserveAddress, TestnetTokenPairs from config import algodClient, sender
注意:不要cd到examples目录下执行脚本,建议在项目根目录下通过路径指定脚本运行,避免相对路径计算偏差。
方法2:以模块模式运行脚本(符合Python项目规范,推荐)
不需要修改任何导入代码,打开终端切换到项目根目录(即src、examples、config.py所在的目录层级),使用-m参数以模块形式执行脚本:
python -m examples.borrow
这种模式下Python会自动将当前终端所在的项目根目录加入模块搜索路径,原有导入逻辑可以正常生效。
如果是长期维护的正式项目,建议在根目录添加pyproject.toml配置文件,将项目以可编辑模式安装到本地环境,后续任意位置运行脚本都不会出现路径导入问题。
内容的提问来源于stack exchange,提问作者Simospa
相关产品推荐
相关产品推荐

