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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 06:12:29