web-dev-qa-db-fra.com

virtualenv sur macOS utilise un interpréteur python inexistant

Quand je lance virtualenv, je reçois ceci:

$ virtualenv
-bash: /usr/local/bin/virtualenv: /usr/local/opt/python/bin/python2.7: bad interpreter: No such file or directory

virtualenv commence seulement à se comporter de cette façon aujourd'hui. Cela a fonctionné hier. Il se casse car virtualenv est un script Python utilisant un interpréteur Python non existant:

$ head -1 $(which virtualenv)
#!/usr/local/opt/python/bin/python2.7

/usr/local/opt/python est un lien symbolique vers un répertoire Python 3.6 sur ma machine:

$ ls -l /usr/local/opt/python
lrwxr-xr-x  1 jim  admin  24  2 Mar 13:45 /usr/local/opt/python -> ../Cellar/python/3.6.4_3

Comme prévu, le répertoire Python 3.6 ne contient pas bin/python2.7:

$ ls /usr/local/Cellar/python/3.6.4_3/bin/
2to3            idle            pip3            pydoc3.6        python3-config      python3.6m-config   wheel3
2to3-3.6        idle3           pip3.6          python          python3.6       pyvenv
easy_install        idle3.6         pydoc           python-config       python3.6-config    pyvenv-3.6
easy_install-3.6    pip         pydoc3          python3         python3.6m      wheel

virtualenv s'attend clairement à ce que /usr/local/opt/python contienne du matériel Python 2, mais il ne contient que du matériel Python 3.

Mon /usr/local/opt/python est géré par Homebrew. Je ne connais pas la provenance de ma virtualenv. Comment savoir d'où vient mon /usr/local/bin/virtualenv?

Lequel est à blâmer? Mon virtualenv ou Homebrew?

9
jameshfisher

La faute en revient à pip et non à Homebrew. Mon /usr/local/bin/virtualenv provient de pip install virtualenv, qui intègre un lien absolu vers l'interpréteur Python au moment de l'installation! J'ai ouvert un problème concernant ce comportement unidiomatique .

7
jameshfisher

Tout d'abord, désolé d'avoir ajouté un commentaire séparé ici - je n'ai pas la réputation d'ajouter un commentaire à la réponse de @ jameshfisher.

J'ai utilisé homebrew pour mettre à jour python2 sur macos vers la dernière version:

~ ❯❯❯ python2 --version
Python 2.7.15

Ce qui crée/met à jour le lien symbolique python2 dans /usr/local/bin pour établir un lien avec cette mise à jour brassée particulière:

~ ❯❯❯ ls -ahl =python2
lrwxr-xr-x  1 michael  admin    39B  3 Jul 17:11 /usr/local/bin/python2 -> ../Cellar/python@2/2.7.15_1/bin/python2

Le Shebang dans mon /usr/local/bin/virtualenv était:

~ ❯❯❯ head -1 $(which virtualenv)
#!/usr/local/opt/python/bin/python2.7

Qui n'existait pas:

~ ❯❯❯ ls -l /usr/local/opt/python/bin/python2.7
ls: /usr/local/opt/python/bin/python2.7: No such file or directory

Donc, modifier le Shebang en #!/usr/local/bin/python2 pour utiliser la version mise à jour de python2 installée dans la distribution était le moyen le plus approprié d’aller:

~ ❯❯❯ virtualenv --version
15.1.0

✨ ????

Pour moi, je me suis dit que si j'avais tapé, which python me donnerait le chemin de ma version de python2 :

~ ❯❯❯ which python
/Users/michael/.pyenv/shims/python
~ ❯❯❯ which python2
/usr/local/bin/python2
~ ❯❯❯ which python3
/Users/michael/.pyenv/shims/python3

~ ❯❯❯ /Users/michael/.pyenv/shims/python --version
Python 3.7.0

J'avais oublié que j'avais défini pyenv global sur python 3.7.0. S'il vous plaît ne tombez pas dans ce piège comme je l'ai fait! ✨ ????

0
gloc.mike

Même problème sur mon Mac. Peut-être que ça s'est cassé quand j'ai mis à jour Mojave? Qui sait.

Résolu avec une installation brew de Python 2:

brew install python2

Cela prend maintenant le relais de mon Python 2.7 installé en usine et me donne une nouvelle virtualenv qui fonctionne:

$ which virtualenv
/usr/local/bin/virtualenv
0
Robert