FileNotFoundError при использовании python -m pytest против pytest - PullRequest
1 голос
/ 25 июня 2019

Я недавно сменил IDE, которую я использую, на VSCode. По большей части мне это нравится, но есть одна конкретная проблема, которую я не могу решить. Я тоже не осознавал, что это проблема, пока не переместил IDE.

У меня есть такая структура каталогов:

my_app
├── env
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64 -> lib
│   ├── pyvenv.cfg
│   └── share
├── my_app
│   ├── expected_results
│   ├── __init__.py
│   ├── test_data
│   └── tests
├── pytest.ini
├── README.rst
├── setup.cfg
└── setup.py

Когда я запускаю свою виртуальную среду, я сижу в корне этой структуры каталогов.

Я запускаю свои тесты, выполняя эту команду (или предоставляя дополнительные параметры). В настоящее время это работает:

pytest

Но, когда VSCode запускается, он выдает ошибку, говоря, что не может найти ожидаемый файл:

E   FileNotFoundError: [Errno 2] No such file or directory: 'my_app/expected_results/expected_available_items.yml'

После некоторого расследования я выяснил, что это потому, что при запуске VSCode он запускает следующую команду:

python -m pytest

Я устанавливаю этот путь следующим образом:

import pathlib
EXPECTED_RESULTS_BASE = pathlib.Path("my_app/expected_results")
expected_results = EXPECTED_RESULTS_BASE.joinpath('expected_available_items.yml')

Что мне нужно изменить, чтобы мои тесты продолжали работать, когда я просто ввожу команду pytest И сработает, если я (или, по-видимому, моя IDE) выдаю python -m pytest?

Надеюсь, можно с уверенностью предположить, что VSCode запускает это из корня my_app, как я?

Ответы [ 2 ]

1 голос
/ 25 июня 2019

Вероятно, недостаточно информации, чтобы ответить вам сразу, но давайте попробуем несколько вещей:

  • В вашем тестовом коде над строкой, в которой вы получаете ошибку, вставьте несколько строк, подобных этим, ипосмотрите, выводят ли они то, что вы ожидаете
print(os.getcwd())
print(EXPECTED_RESULTS_BASE.absolute())
  • Поскольку вы используете venv, и ошибка является результатом вызова pytest другой командой, попробуйте использовать which чтобы увидеть, если вы на самом деле называете разные вещи.И до, и после активации вашего venv:
which pytest
which python

python -m pytest вызовет модуль pytest, установленный с версией python, которую вы только что вызвали.Если python вызывает другую версию, отличную от pytest внутри вашего venv, то это может быть проблемой.

Вы сможете проверить, какая версия Python вызывается Pytest, посмотрев наhashbang в верхней части файла

head -1 $(which pytest)

В моей системе macOS с установленным anaconda Python я получаю следующие команды

$ which pytest
/Users/Shannon/anaconda/bin/pytest

$ which python
/Users/Shannon/anaconda/bin/python

$ head -1 $(which pytest)
#!/Users/Shannon/anaconda/bin/python

Это говорит о том, что pytestвызывая ту же версию Python, которую я получаю, когда звоню python.Таким образом, pytest и python -m pytest должны привести к тому же самому для меня, в моей среде по умолчанию.

Вы уверены, что VSCode правильно загружает ваш venv перед запуском теста?

0 голосов
/ 25 июня 2019

Предполагая, что у вас выбрана виртуальная среда для вашего интерпретатора Python в VS Code:

  1. Откройте терминал в VS Code
  2. Пусть виртуальная среда активирует
  3. Запустите python -m pip install pytest

Это установит pytest в виртуальную среду, поэтому python -m завершается неудачно (pytest глобально на вашем PATH установлен в какой-то глобальной установке Python, к которой виртуальная среда не будет иметь доступак).

...