pytest работает с другой версией python

Я установил pyenv и с ним установили разные версии python:

$ pyenv versions
  system
  2.7.1
  3.2.5
  3.5.0
  3.5.1
* 3.5.2

Я использую следующую команду для переключения на python 3.5.2:

оболочка пиенв 3.5.2

И когда я проверяю версию Python, я получаю следующее:

$ python --version
Python 3.5.2

Но когда я запускаю pytest, он все еще работает под python 2.7.6:

pytest -v
=========================================== ======================= тестовая сессия начинается ======================= ============================================
платформа linux2 -- Python 2.7.6, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /usr/bin/python

Почему pytest работает под старой версией?


person B Faley    schedule 21.11.2016    source источник
comment
Что показывают which python и which pytest? Являются ли ссылки на указанные файлы или какие-то сценарии запуска? Вы также можете попробовать hash -r, чтобы исключить случай устаревшего bash кеша путей.   -  person ivan_pozdeev    schedule 21.11.2016
comment
@ivan_pozdeev which python =› /home/meysam/.pyenv/shims/python - which pytest =› /usr/local/bin/pytest   -  person B Faley    schedule 21.11.2016


Ответы (3)


Итог: бег

  • python -m pytest, or
  • py.test-<version>, если ваш альтернативный Python и pytest установлены с системным менеджером пакетов, или
  • if your alternative Python has been installed with pyenv, switch with pyenv to that version and make sure you have pytest installed for it. Then you can just run pytest.
    • since the pip executable is also among the ones being switched, you need to switch to the alternative Python before installing pytest for it, too.

Как я вижу, /usr/bin/pytest (который принадлежит пакету python-pytest системного менеджера пакетов) имеет шебанг !#/usr/bin/python, так как он соответствует установке системного python.

pyenv, как говорит его README.md, не заменяет /usr/bin/python - потому что его действительно не следует заменять, чтобы не сломать систему пакеты.

Вместо этого он добавляет свой каталог в PATH и вставляет туда средство запуска (называемое "shim"). это то, что вызывается, когда вы вводите «python». Как вы, наверное, догадались, этот хак игнорируется шебангом вроде приведенного выше — как и должно быть.

  • Запуск python -m pytest заставит любой python, который запустится, использовать пакет из его установки.
  • Alternatively, pytest for your other Python version may include versioned executables on the PATH named py.test-<version> (e.g. py.test-3 or py.test-3.6) depending on the way you installed it.
    • If it's from a system package manager's package for nonstandard python - like python36-pytest - this is virtually guaranteed.
    • Я проверил, что если вы устанавливаете версию с pip, она создает только исполняемый файл без версии (хотя вы можете создать версию с версией самостоятельно). Более того, если вы установите тот же пакет для другой версии Python, но с тем же --prefix, он перезапишет существующий исполняемый файл!
  • pyenv's suggested way seems to be to install all python versions of interest and packages for them under ~/.pyenv/versions.
    • This is not applicable for the system's Python but the default /usr/local can be used for it.
    • Once you switch to an alternative Python version, it claims to create shims for all scripts (including pip!) that are currently installed for that version, so invoking those scripts without a path would run those shims.
      • So, if a package (and thus its script) is not installed for the alternative version but installed for system version, trying to run its executable would "fall through" to /usr/local with just the result you're seeing now.
person ivan_pozdeev    schedule 21.11.2016
comment
Я не знаю почему, но когда я запускаю python -m pytest, я получаю эту ошибку: /home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest - person B Faley; 21.11.2016
comment
@Meysam, это означает, что вы не установили pytest для обеих версий Python (вам нужно сделать это отдельно, знаете ли). - person ivan_pozdeev; 21.11.2016
comment
Спасибо. Я установил его отдельно, и теперь он работает :) - person B Faley; 21.11.2016

Я ищу в Интернете и нахожу связанный вопрос. Этот парень работает следующим образом:

python -m pytest tests/my_test.py

Скажите, работает или нет :)

person linpingta    schedule 21.11.2016
comment
Я получаю эту ошибку, выполнив приведенную выше команду: /home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest - person B Faley; 21.11.2016
comment
Вы успешно установили pytest? - person linpingta; 21.11.2016
comment
Да, и все мои тесты проходят, когда я запускаю его. Но работает только под python 2.7.6. - person B Faley; 21.11.2016

Я просто хотел запустить черный для Python 2.7, но я установил его в Python 3.7.9 от pyenv. Со скриптом /usr/local/bin/black27 работало корректно:

PYENV_VERSION=3.7.9 black -t py27 "$@"

Это не сработало с:

pyenv shell 3.7.9
black -t py27 "$@"

ни

pyenv shell 3.7.9
pyenv exec black -t py27 "$@"
person erny    schedule 07.11.2020