pytest running with another version of python
Solution 1
Bottom line: run
-
python -m pytest
, or -
py.test-<version>
if your alternative Python andpytest
are installed with system package manager, or - if your alternative Python has been installed with
pyenv
, switch withpyenv
to that version and make sure you havepytest
installed for it. Then you can just runpytest
.- since the
pip
executable is also among the ones being switched, you need to switch to the alternative Python before installingpytest
for it, too.
- since the
As I can see, /usr/bin/pytest
(that belongs to the system package manager's python-pytest
package) has a shebang !#/usr/bin/python
since it corresponds to the system python's installation.
pyenv
, as its README.md
says, does not replace /usr/bin/python
- because it indeed should not be replaced to avoid breaking system packages.
Instead, it adds its directory to PATH
and inserts a launcher there (called "shim") which is what gets invoked when you type "python
". As you probably guessed, this hack is ignored by a shebang like the above - as it should.
- Running
python -m pytest
will make whicheverpython
that launches itself use the package from its installation. - Alternatively,
pytest
for your other Python version may include versioned executables on thePATH
namedpy.test-<version>
(e.g.py.test-3
orpy.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. - I checked that if you install a version with
pip
, it only creates an unversioned executable (though you can create a versioned one yourself). Moreover, if you install the same package for a different Python version but with the same--prefix
, it will overwrite the existing one's executable!
- If it's from a system package manager's package for nonstandard python - like
-
pyenv
's suggested way seems to be to install allpython
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.
- 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
- This is not applicable for the system's Python but the default
Solution 2
I search the Internet and find the related question. That guy works around with the following way:
python -m pytest tests/my_test.py
Please tell me if that works or not :)
Solution 3
I just wanted to run "black" for Python 2.7, but I have installed it in pyenv's Python 3.7.9. It worked correctly with the script /usr/local/bin/black27
:
PYENV_VERSION=3.7.9 black -t py27 "$@"
It didn't work with:
pyenv shell 3.7.9
black -t py27 "$@"
nor
pyenv shell 3.7.9
pyenv exec black -t py27 "$@"
Related videos on Youtube
B Faley
Updated on July 09, 2022Comments
-
B Faley almost 2 years
I've installed
pyenv
and have different versions of python installed with it:$ pyenv versions system 2.7.1 3.2.5 3.5.0 3.5.1 * 3.5.2
I use the following command to switch to
python 3.5.2
:pyenv shell 3.5.2
And when I check the python version this is what I get:
$ python --version Python 3.5.2
But when I run
pytest
, it still runs underpython 2.7.6
:pytest -v
==================================================================== test session starts ====================================================================
platform linux2 -- Python 2.7.6, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /usr/bin/pythonWhy is
pytest
running under the older version?-
ivan_pozdeev over 7 yearsWhat do
which python
andwhich pytest
show? Are the pointed-to files links or some launcher scripts? You may also tryhash -r
to eliminate the case of stalebash
path cache. -
B Faley over 7 years@ivan_pozdeev
which python
=>/home/meysam/.pyenv/shims/python
-which pytest
=>/usr/local/bin/pytest
-
RealA10N over 2 yearsFrom the
which
out you learn thatpython
uses the python version in your environment, howeverpytest
uses the globally available one, that is located under/usr/local/...
. To run Pytest inside your virtual environment, first install it usingpython -m pip install pytest
and then runpython -m pytest
.
-
-
B Faley over 7 yearsI get this error by running the above command:
/home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest
-
B Faley over 7 yearsI don't know why but when I run
python -m pytest
I get this error:/home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest
-
linpingta over 7 yearsHave you installed pytest successfully?
-
B Faley over 7 yearsYes, and all of my tests are passed when I run it. But it only runs under
python 2.7.6
. -
ivan_pozdeev over 7 years@Meysam that means you didn't install
pytest
for both versions of python (you need to do it separately, you know). -
B Faley over 7 yearsThanks. I installed it separately and now it works :)
-
RealA10N over 2 yearsUse
python -m pip install pytest
to install pytest in the environment and then try runningpython -m pytest