I'm aware of the -p flag, but whenever I use it to specify an interpreter, the resulting environment can't use pip. I want to use a python 3.x project and a python 2.7 project in the same application - as far as I know, the best way to do that is to install both interpreters with pyenv and make a virtual environment using virtualenv in each project folder, specifying the path to the correct interpreter. Here's what I did:
pyenv install 2.7.18
mkdir my_env
virtualenv -p ~/.pyenv/versions/2.7.18/bin/python my_env
source my_env/bin/activate
pip --version
and here's the output of pip --version (or anything involving pip):
Traceback (most recent call last):
File "/home/imageproc/my_env/bin/pip", line 5, in <module>
from pip._internal.cli.main import main
File "/home/imageproc/my_env/lib/python2.7/site-packages/pip/_internal/cli/main.py", line 10, in <module>
from pip._internal.cli.autocompletion import autocomplete
File "/home/imageproc/my_env/lib/python2.7/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
from pip._internal.cli.main_parser import create_main_parser
File "/home/imageproc/my_env/lib/python2.7/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
from pip._internal.cli import cmdoptions
File "/home/imageproc/my_env/lib/python2.7/site-packages/pip/_internal/cli/cmdoptions.py", line 24, in <module>
from pip._internal.exceptions import CommandError
File "/home/imageproc/my_env/lib/python2.7/site-packages/pip/_internal/exceptions.py", line 10, in <module>
from pip._vendor.six import iteritems
ImportError: No module named six
Similarly, if I do the above with a version of python 3.x installed by pyenv,
Traceback (most recent call last):
File "/home/imageproc/env3810/bin/pip", line 5, in <module>
from pip._internal.cli.main import main
File "/home/imageproc/env3810/lib/python3.8/site-packages/pip/_internal/cli/main.py", line 10, in <module>
from pip._internal.cli.autocompletion import autocomplete
File "/home/imageproc/env3810/lib/python3.8/site-packages/pip/_internal/cli/autocompletion.py", line 9, in <module>
from pip._internal.cli.main_parser import create_main_parser
File "/home/imageproc/env3810/lib/python3.8/site-packages/pip/_internal/cli/main_parser.py", line 7, in <module>
from pip._internal.cli import cmdoptions
File "/home/imageproc/env3810/lib/python3.8/site-packages/pip/_internal/cli/cmdoptions.py", line 24, in <module>
from pip._internal.exceptions import CommandError
File "/home/imageproc/env3810/lib/python3.8/site-packages/pip/_internal/exceptions.py", line 10, in <module>
from pip._vendor.six import iteritems
ModuleNotFoundError: No module named 'pip._vendor.six'
It seems like this output could also be relevant, since a module is missing:
$ python -c "import sys
> for i in sys.path:
> print(i)"
~/my_env
~/.pyenv/versions/2.7.18/lib/python27.zip
~/.pyenv/versions/2.7.18/lib/python2.7
~/.pyenv/versions/2.7.18/lib/python2.7/plat-linux2
~/.pyenv/versions/2.7.18/lib/python2.7/lib-tk
~/.pyenv/versions/2.7.18/lib/python2.7/lib-old
~/.pyenv/versions/2.7.18/lib/python2.7/lib-dynload
~/my_env/lib/python2.7/site-packages
Pip works just fine, of course, when I use virtualenv as normal, e.g.
$ which python
/usr/bin/python
$ mkdir sys_env
$ virtualenv sys_env
$ source sys_env/bin/activate
$ pip --version
pip 20.0.2 from ~/sys_env/lib/python3.8/site-packages/pip (python 3.8)
and with that working, the path is
$ python -c "import sys
> for i in sys.path:
> print(i)"
~/sys_env
/usr/lib/python38.zip
/usr/lib/python3.8
/usr/lib/python3.8/lib-dynload
~/sys_env/lib/python3.8/site-packages
I don't quite know what I'm doing enough to find which part of the path the system python uses is missing for the pyenv-installed python or to figure out why it's missing.