解决ModuleNotFoundError: No module named 'data'并支持脚本单独运行
问题描述
在/project目录下运行main.py时出现以下错误:
ModuleNotFoundError: No module named 'data'
项目文件夹结构:
| main.py | +---src | | parameter.py | | __init__.py | | | +---data | | | types.py | | | __init__.py | | | | \---tests test_parameter.py __init__.py
各文件代码:
main.py:
from src import parameter
parameter.py:
from data import types
types.py:
print("Get Types data from here")
单独在/project/src目录下运行parameter.py可正常工作,但修改parameter.py的导入语句为from src.data import types后,main.py能运行,但parameter.py无法单独运行。需求是同时能单独运行main.py和parameter.py,且尽量避免使用sys.path.append。
解决建议
1. 使用相对导入
修改parameter.py的导入语句为相对导入形式:
from .data import types
此时:
- 在
/project目录下运行main.py:直接执行python main.py即可正常工作。 - 单独运行
parameter.py:需要在/project目录下用模块方式启动,执行python -m src.parameter,Python会自动将项目根目录加入模块搜索路径,确保相对导入正常解析。
2. 将项目配置为可安装包
在/project目录下创建pyproject.toml文件,内容如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-project-name" version = "0.1.0" packages = ["src"]
然后在/project目录下执行开发模式安装:
pip install -e .
安装完成后,无论是在/project下运行main.py,还是在任意目录用python -m src.parameter运行parameter.py,甚至直接在/project/src下执行python parameter.py,导入逻辑都能正常工作。因为此时src已被Python识别为全局可导入的包。
3. 统一用模块方式运行脚本
所有脚本都从/project目录以模块方式启动:
- 运行
main.py:将main.py移入src目录,执行python -m src.main - 运行
parameter.py:执行python -m src.parameter
这种方式下,Python会自动把项目根目录加入模块搜索路径,parameter.py中使用from src.data import types的导入语句可同时支持两种运行场景。
内容的提问来源于stack exchange,提问作者sapphire
相关产品推荐
相关产品推荐

