web-dev-qa-db-de.com

virtualenv auf macOS verwendet einen nicht vorhandenen Python-Interpreter

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?

9
jameshfisher

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 .

7
jameshfisher

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

0
gloc.mike

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
0
Robert