采用src布局时Pylint检测tests目录报import-error如何解决?
问题描述
项目采用src布局,目录结构如下:
src ├── packagename │ ├── __init__.py │ └── subpackage │ ├── __init__.py │ └── somemodule.py └── .pylintrc tests ├── subpackage │ ├── __init__.py │ └── test_somemodule.py ├── __init__.py └── .pylintrc pyproject.toml
通过tests/.pylintrc的宽松规则检测测试代码,非src布局下无问题。已在pyproject.toml中配置pytest的Python路径,确保测试可正常运行:
[tool.pytest.ini_options] pythonpath = [ "src" ]
但执行以下Pylint命令时,出现E0401: Unable to import 'packagename.subpackage' (import-error)错误:
pylint --rcfile src/packagename/.pylintrc -j 0 src pylint --rcfile tests/.pylintrc -j 0 tests
解决方案
方法1:执行命令时临时添加Python路径
在检测tests目录的Pylint命令中,通过--init-hook参数将src目录加入Python搜索路径:
pylint --rcfile tests/.pylintrc -j 0 --init-hook "import sys, os; sys.path.insert(0, os.path.abspath('src'))" tests
方法2:在tests目录的Pylint配置中永久设置路径
修改tests/.pylintrc,在[MASTER]段添加初始化钩子,自动加载src路径:
[MASTER] init-hook = import sys, os; sys.path.insert(0, os.path.abspath('../src'))
之后执行原命令即可正常检测,无需额外参数。
方法3:通过pyproject.toml统一配置Pylint路径
在pyproject.toml中添加Pylint全局配置,适用于所有检测场景:
[tool.pylint.main] init-hook = "import sys, os; sys.path.insert(0, os.path.abspath('src'))"
注:若src和tests需使用不同的Pylint规则,方法2的针对性配置更适配需求。
原因说明
Pylint不会自动识别src布局的Python路径,而pytest可通过pyproject.toml的pythonpath配置自动加载src目录。因此需要手动将src目录加入Python搜索路径,让Pylint能找到被测试的包。
内容的提问来源于stack exchange,提问作者jruizaranguren
相关产品推荐
相关产品推荐

