2

使用 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 会有所不同?解决我的错误的最佳方法是什么?

4

1 回答 1

0

我刚刚在基于 devcontainer 的 Python 项目中遇到了同样的问题,并通过配置pytest插件使用的可执行文件(在 中.vscode/settings.json)解决了这个问题:

{
  "python.testing.pytestPath": "/usr/local/bin/pytest"
}
于 2021-03-18T12:29:00.053 回答