Python绝对/相对导入报ModuleNotFoundError问题求解,附项目结构说明
问题根因
你的绝对导入写法没有问题,报错核心是Python运行时的模块搜索路径(sys.path)未包含你的项目根目录/home/pi/crypto,因此解释器无法识别src作为顶层包。你之前添加的sys.path修改代码未生效,是因为同目录其他文件的导入逻辑在你修改sys.path之前就已经执行,因此还是会触发模块找不到的错误。
解决方案
方案1:无需修改项目结构/代码(最推荐)
直接在项目根目录(crypto目录)下,用Python的-m参数以模块方式运行脚本,不要直接运行py文件:
python -m src.ethMessage
注意不要加.py后缀,路径用.分割即可-m参数会自动将当前工作目录加入sys.path,你现有的绝对导入写法可以直接生效,不需要修改任何代码。
方案2:临时指定PYTHONPATH环境变量
如果不想每次都加-m参数,可以在运行脚本前临时设置PYTHONPATH为当前项目根目录:
- Linux/Mac 终端:
export PYTHONPATH=$(pwd) && python src/ethMessage.py
- Windows CMD:
set PYTHONPATH=%cd% && python src\ethMessage.py
- Windows PowerShell:
$env:PYTHONPATH=$PWD.Path; python src\ethMessage.py
方案3:调整项目结构一劳永逸
如果需要频繁运行脚本,也可以调整项目结构避免每次加参数:
- 在项目根目录新建
scripts文件夹,把所有需要直接运行的脚本从src目录移到scripts下,调整后结构如下:
- config - data - src - resources - db - test - scripts - ethMessage.py - 其他可执行脚本
- 所有代码的导入保持原绝对导入写法
from src.xxx import xxx即可,运行时在根目录下直接执行:
python scripts/ethMessage.py
可选:原sys.path修改代码的正确写法
如果你坚持要在代码里加路径修改逻辑,必须把这段代码放在所有导入语句的最前面,甚至要放在导入同目录其他py文件的前面,示例如下:
import os import sys # 第一时间修改sys.path sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) # 后面再写其他导入逻辑 import update_db from db.mysql_main import insertValueAndFee
该方式不推荐,跨环境运行容易出现兼容性问题。
内容的提问来源于stack exchange,提问作者Alberto Pirillo
相关产品推荐
相关产品推荐

