使用 VSCODE python 扩展运行 pytest 时出现导入错误。从命令行运行 pytest 时,我没有收到错误消息。
我有一个具有以下设置的 python 2.7 项目。
provision/
|-- venv/
|-- requirements.txt
|-- model_config/
| |-- ifrs9model_config/
| |-- |-- __init__.py
| |-- |-- model_config.py
| |
| |-- data/
| | |-- input.csv
| |
| |-- tests/
| | |--conftest.py
| | |--test_model_config.py
| |
| |-- setup.py
| |-- README
我已将包 ifrs9model_config 安装到 venv 中。这允许我在 conftest.py 文件中导入 ifrs9model_config,如下所示:
from ifrs9model_config import model_config
当我直接运行 conftest.py 时,它工作正常。当我从命令行运行 pytest 时(激活 venv 之后),它也可以正常工作。但是当我使用 VSCODE 的 python 扩展运行 pytest 时,我得到了错误:
ImportError while loading conftest '/sasdata/Lev3/apps/provision/model_config/tests/conftest.py'.
tests/conftest.py:6: in <module>
from ifrs9model_config import model_config
E ImportError: No module named ifrs9model_config
vscode pytest 正在运行以下命令:
python /home/<userid>/.vscode-server-insiders/extensions/ms-python.python-2020.10.332292344/pythonFiles/testing_tools/run_adapter.py discover pytest -- --rootdir /sasdata/Lev3/apps/provision/model_config -s --cache-clear tests
打印了 sys.path(主要来自 conftest.py 脚本)后,我注意到当 VSCODE 运行 pytest 时,pytest rootdir (/sasdata/Lev3/apps/provision/model_config) 不包含在 sys.path 中。但是,当我使用以下命令从命令行运行 pytest 时,它会包含在内:
pytest --rootdir /sasdata/Lev3/apps/provision/model_config/ -s --cache-clear tests
run_adapter.py 脚本确实将一些目录插入到 sys.path 值中,但这并不能解释为什么上面没有。
现在,如果我在 conftest.py 文件中添加这样的一行:
sys.path.append('/sasdata/Lev3/apps/provision/model_config/')
它在 VSCODE 中工作。
我对此感到特别困惑,因为我认为通过使用 setup.py 和“pip install -e”将 ifrs9model_config 包安装到 venv 中,该模块将可用于 venv 中的任何 python 会话?
我还读到弄乱 sys.path 是不好的形式,无论哪种方式,我都不是特别热衷于将代码添加到我的脚本中,只是为了帮助 VSCODE 运行。
从 VSCODE 与命令行执行 pytest 时,为什么 sys.path 会有所不同?解决我的错误的最佳方法是什么?