[PYTHON] Was Rubyist bei der Verwendung von Pyenv wissen sollte

Einführung

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.

  1. pyenv und rbenv sind für Anwendungen, die Bundler in Ruby nicht verwenden, fast identisch.
  2. In Situationen, in denen Bundler verwendet wird, wird venv in Python verwendet, aber venv korrigiert auch die Version von Python, sodass pyenv local nicht benötigt wird.
  3. Es ist praktisch, pyenv-virtualenv zu verwenden, aber Shims werden schmutzig, weil es so ist, als würde man Bundler mit rbenv verwalten.
  4. Im Gegenteil, es ist auch möglich, Pyenv nur zum Bauen zu verwenden, ohne Unterlegscheiben zu verwenden und ohne die Schale schwer zu machen.

Unterschied zwischen Bundler und venv

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.

Über die Aktivierung der virtuellen Umgebung

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

Über pyenv-virtualenv

pyenv-virtualenv ist ein Tool zum Verwalten virtueller Umgebungen mit den Funktionen von pyenv. Es hat die folgenden Vorteile.

  1. Unterstützt Python 2, das kein venv in der Standardbibliothek enthält, mit einem Drittanbieter-Tool namens virtualenv
  2. Verwaltet das Verzeichnis der virtuellen Umgebung in pyenv
  3. Die virtuelle Umgebung kann durch einen Mechanismus wie "pyenv local" verwendet (aktiviert) werden.

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.

Alternative zu pyenv-virtualenv

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

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.

Verwenden Sie venv direkt

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

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

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.

pipenv

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.

So verwenden Sie pyenv nur zum Erstellen von Python

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

Was Rubyist bei der Verwendung von Pyenv wissen sollte
Worauf ich mich bei der Verwendung von Tensorflow-gpu eingelassen habe
Was jeder Programmierer über Speicher wissen sollte
Was Emacs-Benutzer wissen sollten, wenn sie Python-Code in Sublime Text schreiben
Was verwenden Sie beim Testen mit Python?
Installationsmethode bei Verwendung von RealSense aus Python (pyenv edition)
Ursachen, wenn die Python-Version nicht mit pyenv geändert werden kann
Tipps zum Programmieren von Wettbewerben mit Python2
Mindestnotizen bei Verwendung von Python auf Mac (pyenv edition)
Wovon ich süchtig war, als ich Python Tornado benutzte
Zusammenfassung bei Verwendung von Fabric
Vorsichtsmaßnahmen bei der Verwendung von Chainer
Was wurde gefragt, wenn Random Forest in der Praxis verwendet wurde?
Liste der zu installierenden Bibliotheken bei der Installation von Python mit Pyenv