Ich denke, dass die Anzahl der Rubyisten, die anfangen, Python zu berühren, aufgrund des Booms des maschinellen Lernens gestiegen ist. Zu diesem Zeitpunkt ist der Bau von Umgebungen wahrscheinlich ein Problem. In Ruby ist rbenv der De-facto-Standard, aber aus irgendeinem Grund hat Python viele negative Meinungen über pyenv.
Ich benutze Pyenv und finde es nützlich. Ich benutze Ruby auch selten, habe aber auch die Unterschiede zwischen den Tool-Stacks von Ruby und Python untersucht. (Referenz: Vergleich von Edelstein, Bündler und Pip, Venv)
Unter diesem Gesichtspunkt möchte ich die Unterschiede zwischen Ruby- und Python-Umgebungen zusammenfassen, die Ruby-Benutzer kennen sollten, wenn sie entscheiden, wie sie pyenv für sich selbst verwenden.
tl;dr
Selbst wenn ich es sorgfältig erkläre, gibt es Leute, die sofort negativ lesen, dass "ich einen so langen Artikel lesen muss, um Python zu verwenden", also werde ich es in 4 Zeilen zusammenfassen.
pyenv local
nicht benötigt wird.Die Rollenverteilung der Paketverwaltungstools unterscheidet sich geringfügig zwischen Ruby und Python. Pythons Pip verfügt über Funktionen wie Abhängigkeitsauflösung und Versionssperre. In dieser Hinsicht enthält es einige Funktionen von Bundler und Gem.
Andererseits ist die Funktion zum unabhängigen Verwalten von Paketen für jedes Projekt (Bundlers bundle install --path
) venv. Ich benutze ein Tool namens. [^ 1](Referenz: [bundler --path and venv](http://qiita.com/methane/items/570728ad3e79c74f4e9e#bundler-%E3%81%AE --- path-% E3% 81% A8 -venv)))
Der große Unterschied zwischen venv und bundle install --path
besteht darin, dass sich venv wie ein unabhängig eingerichtetes Python verhält und nicht nur Pakete speichert. Dies wird als "virtuelle Umgebung" bezeichnet. Die virtuelle Umgebung ist kompakter als die tatsächlich installierte Python-Umgebung, da die Standardbibliothek mit der ursprünglichen Python-Bibliothek identisch ist. Siehe folgendes Beispiel.
$ python3 -m venv .venv # .Erstellen Sie eine virtuelle Umgebung in einem Verzeichnis mit dem Namen venv.
$ ls -F .venv/
bin/ include/ lib/ pip-selfcheck.json pyvenv.cfg
$ .venv/bin/pip install tornado
Collecting tornado
Installing collected packages: tornado
Successfully installed tornado-4.5.1
$ .venv/bin/python
Python 3.6.1 (default, May 18 2017, 16:23:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tornado
Wie Sie sehen können, können Sie in einer virtuellen Umgebung "pip install" ohne Optionen aufrufen, wie Sie normalerweise eine Bibliothek in Python installieren würden, und virtuell, ohne etwas wie "bundle exec ruby" zu tun. Der Python in der Umgebung kann die installierten Bibliotheken importieren.
Der große Unterschied zu Bundle Exec in Ruby besteht nun darin, dass die Python-Version der virtuellen Umgebung beim Erstellen der virtuellen Umgebung festgelegt wird. Es reicht also aus, anzugeben, welche Python-Version beim Erstellen der virtuellen Umgebung nur einmal verwendet werden soll. .. Dies bedeutet, dass Sie nicht "pyenv local" konfigurieren müssen, um jedes Mal dieselbe Version von Python zu verwenden. [^ 2]
[^ 2]: Ich denke, dieser Unterschied ist der Grund, warum Pyenv viele negative Meinungen zu "Gibt es einen Verdienst, Magie in die Hülle zu bringen und sie zu verlangsamen?" Hat.
Es gibt verschiedene Möglichkeiten, die Python-Version nur beim Erstellen einer virtuellen Umgebung vorübergehend anzugeben.
$ pyenv shell 3.6.1
$ python -m venv venv
$ pyenv shell --unset
(Oder)
$ `pyenv root`/versions/3.6.1/bin/python -m venv venv
[^ 1]: Ich habe die Option pip install --target
oder pip install --prefix
, aber es gibt keinen Befehl, der bundle exec
entspricht, und ich besitze PYTHONPATH
Muss eingestellt sein. Ich empfehle es nicht, weil es nicht sehr üblich ist.
Mit venv erstellte virtuelle Umgebungen können "aktiviert" werden. "enable" fügt das bin-Verzeichnis der virtuellen Umgebung am Anfang der Umgebungsvariablen PATH hinzu, sodass Sie den Befehl wie "pip" anstelle von "venv / bin / pip" ausführen können.
Die Umgebungsvariable VIRTUAL_ENV wird ebenfalls gesetzt. Das Vim-Abschluss-Plug-In für Python usw. untersucht diese Umgebungsvariable und führt die Methodenvervollständigung der importierten Bibliothek durch.
$ . venv/bin/activate #Aktivieren Sie die virtuelle Umgebung
$ echo $VIRTUAL_ENV
/Users/inada-n/tmp/venv
$ which python
/Users/inada-n/tmp/venv/bin/python
$ which pip
/Users/inada-n/tmp/venv/bin/pip
$ deactivate #Befehl zum Aktivieren aktivieren
$ which python
/Users/inada-n/pyenv/shims/python
pyenv-virtualenv ist ein Tool zum Verwalten virtueller Umgebungen mit den Funktionen von pyenv. Es hat die folgenden Vorteile.
Es gibt jedoch eine Einschränkung bezüglich dieser Nummer 3. rbenv, pyenv usw. verwenden einen Mechanismus namens Shims, um mehrere Versionen (einschließlich virtueller Umgebungen) ordnungsgemäß zu verwenden.
Um Shims grob zu erklären, sammeln Sie die Befehlsnamen aus allen Versionen im Verzeichnis "bin /" und bereiten Sie ein Shell-Skript mit demselben Namen in "$ PYENV_ROOT / shims" vor. Das Shell-Skript soll den Befehlsnamen "pyenv exec" ausführen.
Das Verwalten der virtuellen Umgebung mit diesem Mechanismus bedeutet, dass Befehle in der virtuellen Umgebung, z. B. solche, die mit dem Befehlsnamen "bundle exec" in Bundler ausgeführt werden, ebenfalls Shims eingeben und im PATH zugänglich sind. Das ist. Befehle, die von Bibliotheken bereitgestellt werden, die nur in einer virtuellen Umgebung für ein Projekt installiert sind, sind immer im PATH vorhanden, werden beim Abschluss des TAB-Schlüssels angezeigt und verursachen bei der Ausführung einen Fehler.
(Zum Beispiel pyenv: pygementize: Befehl nicht gefunden
).
Mit anderen Worten, die Bequemlichkeit von pyenv-virtualenv geht zu Lasten von "Befehlen in der Quarantäneumgebung verschmutzen den globalen Pfad". Wenn Sie jedoch "pyenv deinstallieren den Namen der virtuellen Umgebung" ausführen, werden Befehle, die für diese virtuelle Umgebung eindeutig sind, aus Shims entfernt, sodass es durchaus möglich ist, pyenv-virtualenv schrittweise zu stoppen, nachdem die Nachteile tatsächlich zu einem Problem geworden sind. Ich glaube nicht, dass du so verängstigt sein musst.
Hier ist eine kurze Einführung in alternative Tools, die Sie verwenden können, wenn Sie pyenv-virtualenv nicht verwenden. Bitte suchen Sie separat nach der spezifischen Verwendung jedes Tools.
direnv ist ein Tool, mit dem Sie Umgebungsvariablen anpassen können, wenn Sie das Verzeichnis Ihres Projekts betreten und verlassen.
Sie können letztere der von pyenv-virtualenv bereitgestellten Funktionen "Verwaltung virtueller Umgebungen" und "Automatisch aktivieren" ersetzen. Wenn Sie beispielsweise wie folgt in .envrc
schreiben, wird automatisch die virtuelle Umgebung mit dem Namen venv
in diesem Verzeichnis aktiviert.
.envrc
source venv/bin/activate
Es ist nicht auf Python beschränkt, sondern für Go-Entwickler praktisch, es für allgemeine Zwecke zu verwenden, z. B. zum Ändern des GOPATH für jedes Projekt.
Die erste Wahl besteht darin, venv direkt wie oben beschrieben zu verwenden („Unterschiede zwischen Bundler und venv“), ohne die unten beschriebenen Tools zur Verwaltung virtueller Umgebungen wie virtualenvwrapper und pew zu verwenden.
Dies kommt der Benutzerfreundlichkeit von rbenv + Bundler am nächsten, daher denke ich, dass es leicht zu verstehen ist. Wenn Sie eine automatische Aktivierung Ihrer virtuellen Umgebung benötigen, können Sie das oben eingeführte Verzeichnis verwenden.
Leider gibt es im Vergleich zu Bundler keinen Standard oder De-facto-Standard für Verzeichnisnamen in virtuellen Umgebungen wie "vendor / bundle" oder "node_modules". Sie oder Ihr Team müssen entscheiden, welches verwendet werden soll, z. B. "venv", ".venv", "vendor / venv".
virtualenvwrapper ist ein Tool zur Verwaltung virtueller Umgebungen, das seit langem von starken Python-Entwicklern verwendet wird.
Sie können virtuelle Umgebungen in dem Verzeichnis erstellen, löschen und aktivieren, das durch die Umgebungsvariable "WORKON_HOME" angegeben wird (oder "$ HOME / .virtualenvs", falls nicht angegeben).
pew ähnelt virtualenvwrapper, verwendet jedoch anstelle des von venv bereitgestellten Befehls eine eigene Implementierung, um die virtuelle Umgebung zu aktivieren. Anstatt die aktuelle Shell anzupassen, führen Sie die angepasste Shell als untergeordneten Prozess aus. Sie können zur ursprünglichen Umgebung zurückkehren, indem Sie die untergeordnete Shell mit Strg-D anstelle des Befehls "Deaktivieren" schließen.
Wenn Sie pew installieren, wird ein Tool namens pythonz, das mehrere Versionen von Python erstellt und verwaltet, die mit pyenv in Konflikt stehen, als Abhängigkeit installiert. Da das Update jedoch langsamer als pyenv ist, können Sie pyenv verwenden, ohne sich darüber Gedanken machen zu müssen. Überlegen.
Ein neues, benutzerfreundliches Tool wie Bundler. Anstelle der von pip verwendeten Anforderungsdatei verwalten wir die Bibliothek mithilfe einer komplexeren TOML-basierten Datei namens Pipfile. Beachten Sie, dass Pipfile immer noch ein experimentelles Tool ist und sich das Format in Zukunft möglicherweise ändern wird. Sie müssen daher darauf vorbereitet sein. (Ich denke nicht, dass es sich so oft ändert)
Standardmäßig wird pew zum Verwalten der virtuellen Umgebung verwendet. Wenn Sie jedoch "PIPENV_VENV_IN_PROJECT = true" und die Umgebungsvariable festlegen, wird das Verzeichnis ".venv" unter dem Projekt verwendet, also Bundlers Ich denke, es wird näher an der Benutzerfreundlichkeit sein.
Wenn Sie die Versionsumschaltfunktion von pyenv wie "pyenv local" nicht verwenden möchten, finden Sie "echo'eval" in pyenv-Installationsanweisungen. Sie können die Shell leichter machen und keine Shims verwenden, indem Sie "$ (pyenv init -)" '>> ~ / .bash_profileweglassen. Wenn Sie diesen Schritt weglassen, funktionieren
pyenv install,
pyenv uninstall,
pyenv version`` einwandfrei.
Anstelle von "pyenv global" ist es eine gute Idee, direkt in Ihren Pfad für Ihre übliche Python-Version zu gehen.
$ echo 'export PATH=$PYENV_ROOT/versions/3.6.1/bin:${PATH}' >> ~/.bash_profile
Wenn Sie süchtig sind, können Sie Ihr reguläres Python zu einer virtuellen Umgebung machen, um das von pyenv erstellte Python sauber zu halten.
$ $PYENV_ROOT/versions/3.6.1/bin/python -m venv ~/local/python-default
$ echo 'export PATH=$HOME/local/python-default/bin:${PATH}' >> ~/.bash_profile
Recommended Posts