Python项目运行报ModuleNotFoundError,用-m参数可正常运行问题求解
问题原因
Python不同运行方式的模块搜索路径(sys.path)逻辑不同:
- 直接执行
python 文件路径时,Python会自动将该文件所在的目录(你的情况是/home/rmali/git/azima/core/)加入sys.path,你的helper包存放在项目根目录azima下,不在core目录里,因此搜索不到对应模块。 - 执行
python -m core.project_setup时,Python会将执行命令时的当前工作目录(你的情况是/home/rmali/git/azima/,也就是项目根目录)加入sys.path,helper包正好在该路径下,因此可以正常导入。
解决方案
方案1:临时指定PYTHONPATH运行
在运行命令前指定项目根目录为模块搜索路径:
PYTHONPATH=/home/rmali/git/azima /home/rmali/git/azima/venv/bin/python /home/rmali/git/azima/core/project_setup.py
也可以先在当前终端执行export PYTHONPATH=$(pwd)(确保当前在azima根目录下),再直接执行你的原运行命令。
方案2:代码内手动添加项目根路径到sys.path
在project_setup.py的最开头添加如下代码,将项目根目录加入搜索路径:
import sys from pathlib import Path # 获取当前文件的上两级目录,也就是azima项目根目录 project_root = Path(__file__).parent.parent.resolve() sys.path.append(str(project_root))
添加后再导入helper相关模块即可。
方案3:将项目安装到虚拟环境(推荐长期开发用)
在项目根目录下新增pyproject.toml配置文件,配置基础的项目信息,之后执行pip install -e .将项目以可编辑模式安装到当前虚拟环境,之后不管在哪个目录、用哪种方式运行,都可以正常识别项目内的模块。
补充注意
建议在helper目录下新增空的__init__.py文件,虽然Python 3.3+支持无__init__.py的命名空间包,但加上可以避免一些特殊场景下的导入异常。
内容的提问来源于stack exchange,提问作者Azima
相关产品推荐
相关产品推荐

