Python跨目录调用模块疑问:项目中导入utils报错的解决方案是否正确
问题解答
场景回顾
你的项目目录结构:
Project ├── src | ├── eval.py | └── utils.py └── app.py
eval.py中使用from utils import clean_txt导入函数,直接运行python src/eval.py时正常- 但通过
app.py调用eval.py时,出现错误:
from utils import reading_jobs_for_id_api
ModuleNotFoundError: No module named 'utils'
关于export PYTHONPATH的有效性
export PYTHONPATH="${PYTHONPATH}:$PWD"是临时可行的应急方案,但并非编写Python包的规范做法:
- 它的原理是将当前项目根目录(Project)加入Python的模块搜索路径,让Python能找到
src下的模块 - 局限性很明显:仅在当前终端会话生效,重启终端后需重新执行;跨环境(Windows、不同Shell)需要不同的配置命令;其他开发者克隆项目后必须手动执行该命令,容易引发环境配置问题。
规范的解决方案
推荐将项目重构为标准的Python包结构,无需依赖PYTHONPATH配置:
1. 将src转为可导入包
在src目录下创建空的__init__.py文件,目录结构变为:
Project ├── src | ├── __init__.py | ├── eval.py | └── utils.py └── app.py
2. 修改导入语句
在eval.py中选择以下一种导入方式:
- 相对导入(适合包内部模块间引用):
from .utils import clean_txt - 绝对导入(更清晰,适合大型项目):
from src.utils import clean_txt
3. 调整运行/调用方式
- 直接运行
eval.py时,在Project目录下使用模块方式启动:python -m src.eval - 在
app.py中调用eval.py的逻辑时,使用绝对导入:from src.eval import 目标函数或类 # 若要执行eval.py的全部逻辑,可直接导入模块 import src.eval
进阶优化(可选)
如果是需要分发的项目,可以在Project目录下添加pyproject.toml或setup.py,将项目转为可安装的包,执行pip install -e .后,任何位置都能直接导入src下的模块,彻底解决路径问题。
内容的提问来源于stack exchange,提问作者Minions
相关产品推荐
相关产品推荐

