Cuando ejecuto virtualenv , obtengo esto:
$ virtualenv -bash: /usr/local/bin/virtualenv: /usr/local/opt/python/bin/python2.7: bad interpreter: No such file or directory virtualenv solo comenzó a comportarse de esta manera hoy. Funcionó ayer. Se rompe porque virtualenv es un script de Python que usa un intérprete de Python inexistente:
$ head -1 $(which virtualenv) #!/usr/local/opt/python/bin/python2.7 En mi máquina, /usr/local/opt/python es un enlace simbólico a un directorio de Python 3.6:
$ 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 Como era de esperar, el directorio de Python 3.6 no contiene 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 claramente espera que /usr/local/opt/python contenga material de Python 2, pero solo contiene material de Python 3.
Homebrew administra mi /usr/local/opt/python . No sé la procedencia de mi virtualenv . ¿Cómo averiguo de dónde vino mi /usr/local/bin/virtualenv ?
¿Cuál tiene la culpa? ¿Mi virtualenv o Homebrew?
La culpa de esto recae en pip , no en Homebrew. Mi /usr/local/bin/virtualenv proviene de pip install virtualenv , que incorpora un enlace absoluto al intérprete de Python en el momento de la instalación. He abierto un tema sobre este comportamiento unidiomático .
Mismo problema en mi Mac. ¿Quizás se rompió cuando actualicé a Mojave? Quién sabe.
Resuelto con una instalación de brew de Python 2:
brew install python2 Esto ahora se hace cargo de mi Python 2.7 instalado de fábrica y me da un nuevo virtualenv que funciona:
$ which virtualenv /usr/local/bin/virtualenvEn primer lugar, lo siento por agregar un comentario separado aquí: carezco de la reputación para agregar un comentario a la respuesta de @jameshfisher.
Usé homebrew para actualizar python2 en macos a la última versión:
~ ❯❯❯ python2 --version Python 2.7.15 Lo que crea/actualiza el enlace simbólico de python2 en /usr/local/bin para vincular a esa actualización instalada de brew en particular:
~ ❯❯❯ 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 El shebang en mi /usr/local/bin/virtualenv fue:
~ ❯❯❯ head -1 $(which virtualenv) #!/usr/local/opt/python/bin/python2.7que no existió:
~ ❯❯❯ ls -l /usr/local/opt/python/bin/python2.7 ls: /usr/local/opt/python/bin/python2.7: No such file or directory Entonces, modificar el shebang a #!/usr/local/bin/python2 para usar la versión actualizada de python2 instalada en brew fue la forma más apropiada de hacerlo:
~ ❯❯❯ virtualenv --version 15.1.0✨🐟✨
Un poco como una cortina de humo para mí fue que había asumido erróneamente que escribir which python me daría la ruta a mi versión 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 Había olvidado que había configurado pyenv global en python 3.7.0 . ¡Por favor, no caigas en esa trampa como lo hice yo! ✨😄✨