Wenn ich virtualenv
starte, bekomme ich Folgendes:
$ virtualenv
-bash: /usr/local/bin/virtualenv: /usr/local/opt/python/bin/python2.7: bad interpreter: No such file or directory
virtualenv
hat sich erst heute so verhalten. Es hat gestern funktioniert. Es bricht, weil virtualenv
ein Python-Skript ist, das einen nicht vorhandenen Python-Interpreter verwendet:
$ head -1 $(which virtualenv)
#!/usr/local/opt/python/bin/python2.7
Auf meinem Rechner ist /usr/local/opt/python
ein Symlink zu einem Python 3.6-Verzeichnis:
$ 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
Wie erwartet enthält das Python 3.6-Verzeichnis keinen 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
erwartet eindeutig, dass /usr/local/opt/python
Python 2-Material enthält, es enthält jedoch nur Python 3-Material.
Mein /usr/local/opt/python
wird von Homebrew verwaltet. Ich kenne die Herkunft meines virtualenv
nicht. Wie erfahre ich, woher mein /usr/local/bin/virtualenv
kam?
Was ist schuld? Mein virtualenv
oder Homebrew?
Die Schuld dafür liegt bei pip
, nicht bei Homebrew. Mein /usr/local/bin/virtualenv
stammt von pip install virtualenv
, der zur Installation einen absoluten Link zum Python-Interpreter enthält! Ich habe ein Thema zu diesem unidiomatischen Verhalten geöffnet .
Zunächst einmal tut es mir leid, dass Sie hier einen separaten Kommentar hinzugefügt haben - es fehlt mir der Ruf, einen Kommentar zu @ jameshfishers Antwort hinzuzufügen.
Ich habe Homebrew verwendet, um Python2 auf Macos auf die neueste Version zu aktualisieren:
~ ❯❯❯ python2 --version
Python 2.7.15
Dadurch wird der python2
-Symlink in /usr/local/bin
erstellt/aktualisiert, um eine Verknüpfung zu dem betreffenden installierten Brew-Update herzustellen:
~ ❯❯❯ ls -ahl =python2
lrwxr-xr-x 1 michael admin 39B 3 Jul 17:11 /usr/local/bin/python2 -> ../Cellar/[email protected]/2.7.15_1/bin/python2
Der Shebang in meinem /usr/local/bin/virtualenv
war:
~ ❯❯❯ head -1 $(which virtualenv)
#!/usr/local/opt/python/bin/python2.7
Welche nicht existierten:
~ ❯❯❯ ls -l /usr/local/opt/python/bin/python2.7
ls: /usr/local/opt/python/bin/python2.7: No such file or directory
Daher war es am besten, den Shebang zu #!/usr/local/bin/python2
zu ändern, um die aktualisierte Version von python2 zu verwenden:
~ ❯❯❯ virtualenv --version
15.1.0
✨ ????
Ein bisschen roter Hering war für mich, dass ich irrtümlicherweise angenommen hatte, dass die Eingabe von which python
mir den Pfad zu meiner Version von python2 geben würde:
~ ❯❯❯ 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
Ich hatte vergessen, dass ich pyenv global
auf Python 3.7.0
eingestellt hatte. Bitte falle nicht wie ich in diese Falle! ✨ ????
Gleiches Problem auf meinem Mac. Vielleicht wurde es kaputt, als ich auf Mojave umgestiegen bin? Wer weiß.
Mit einer brew
-Installation von Python 2 behoben:
brew install python2
Dies übernimmt jetzt mein werkseitig installiertes Python 2.7 und gibt mir eine neue virtualenv
, die funktioniert:
$ which virtualenv
/usr/local/bin/virtualenv