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?
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 .
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! ✨ ????
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