pytest running with another version of python
Bottom line: run
python -m pytest
, orpy.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
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 "$@"
I found this related question. For them it worked with this:
python -m pytest tests/my_test.py
I hope it works