[PYTHON] Ce que Rubyist doit savoir lors de l'utilisation de pyenv

introduction

Je pense que le nombre de Rubyistes qui commencent à toucher Python a augmenté en raison du boom de l'apprentissage automatique. À ce moment-là, la construction de l'environnement sera probablement un problème. En Ruby, rbenv est la norme de facto, mais pour une raison quelconque, il existe de nombreuses opinions négatives sur pyenv en Python.

J'utilise pyenv et je le trouve utile. J'utilise aussi rarement Ruby, mais j'ai également étudié les différences entre les piles d'outils de Ruby et Python. (Référence: Comparaison de gem, bundler et pip, venv)

De ce point de vue, je voudrais résumer les différences entre les environnements Ruby et Python que les utilisateurs de Ruby devraient connaître lorsqu'ils décident comment utiliser pyenv pour eux-mêmes.

tl;dr

Même si je l'explique soigneusement, il y a des gens qui ont immédiatement lu négativement que "je dois lire un article aussi long pour utiliser Python", donc je vais le résumer en 4 lignes.

  1. pyenv et rbenv sont presque les mêmes pour les applications qui n'utilisent pas Bundler dans Ruby.
  2. Dans les situations où Bundler est utilisé, venv est utilisé en Python, mais venv corrige également la version de Python, donc pyenv local n'est pas nécessaire.
  3. Il est pratique d'utiliser pyenv-virtualenv, mais les shims deviennent sales car c'est comme gérer Bundler avec rbenv.
  4. Au contraire, il est également possible d'utiliser le pyenv uniquement pour la construction sans utiliser de cales et sans alourdir la coque.

Différence entre Bundler et Venv

La répartition des rôles des outils de gestion de packages est légèrement différente entre Ruby et Python. Le pip de Python a des fonctionnalités telles que la résolution des dépendances et le verrouillage de version, donc à cet égard, il inclut une partie du rôle de Bundler ainsi que de gem.

D'autre part, la fonction pour gérer les paquets indépendamment pour chaque projet (`` bundle install --path '' de Bundler) est venv. J'utilise un outil appelé. [^ 1](Référence: [bundler --path and venv](http://qiita.com/methane/items/570728ad3e79c74f4e9e#bundler-%E3%81%AE --- path-% E3% 81% A8 -venv)))

La grande différence entre venv et `` bundle install --path '' est que venv se comporte comme un Python configuré indépendamment, plutôt que de simplement stocker des paquets. C'est ce qu'on appelle un «environnement virtuel». L'environnement virtuel est plus compact que l'environnement Python réellement installé car la bibliothèque standard est la même que le Python d'origine. Voir l'exemple suivant.

$ python3 -m venv .venv  # .Créez un environnement virtuel dans un répertoire nommé 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

Comme vous pouvez le voir, dans un environnement virtuel, vous pouvez appeler pip install '' sans options comme vous le feriez normalement pour installer une bibliothèque en Python, et virtuel sans faire quelque chose comme bundle exec ruby``. Le python de l'environnement peut importer les bibliothèques installées.

Désormais, la grande différence avec le bundle exec de Ruby est que la version Python de l'environnement virtuel est déterminée lorsque vous créez l'environnement virtuel, il suffit donc de spécifier la version de Python à utiliser une seule fois lors de la création de l'environnement virtuel. .. Cela signifie que vous n'avez pas à configurer `` pyenv local '' pour utiliser la même version de Python à chaque fois. [^ 2]

[^ 2]: Je pense que cette différence est la raison pour laquelle il y a tant d'opinions négatives sur pyenv à propos de "Y a-t-il un mérite d'apporter de la magie à la coquille et de la ralentir?"

Il existe plusieurs façons de spécifier temporairement la version Python uniquement lors de la création d'un environnement virtuel.

$ pyenv shell 3.6.1
$ python -m venv venv
$ pyenv shell --unset
(Ou)
$ `pyenv root`/versions/3.6.1/bin/python -m venv venv

[^ 1]: J'ai l'option pip install --target ou pip install --prefix, mais il n'y a pas de commande équivalente à bundle exec et je possède PYTHONPATH Doit être installé. Je ne le recommande pas car ce n'est pas une pratique très courante.

À propos de l'activation de l'environnement virtuel

Les environnements virtuels créés avec venv peuvent être "activés". "activate" ajoutera le répertoire bin de l'environnement virtuel au début de la variable d'environnement PATH, afin que vous puissiez exécuter la commande comme pip au lieu de venv / bin / pip.

La variable d'environnement VIRTUAL_ENV est également définie. Le plug-in de complétion de Vim pour Python etc. examine cette variable d'environnement et exécute la complétion de méthode pour la bibliothèque importée.

$ . venv/bin/activate  #Activez l'environnement virtuel

$ 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  #Commande pour activer activer

$ which python
/Users/inada-n/pyenv/shims/python

À propos de pyenv-virtualenv

pyenv-virtualenv est un outil de gestion d'environnements virtuels utilisant les fonctions de pyenv. Il présente les avantages suivants.

  1. Prend en charge Python 2 qui n'a pas venv dans la bibliothèque standard avec un outil tiers appelé virtualenv
  2. Gère le répertoire de l'environnement virtuel dans pyenv
  3. L'environnement virtuel peut être utilisé (activé) par un mécanisme tel que `` pyenv local ''.

Cependant, il y a une mise en garde concernant ce numéro 3. rbenv, pyenv, etc. utilisent un mécanisme appelé shims pour utiliser correctement plusieurs versions (y compris les environnements virtuels).

Pour expliquer grossièrement les shims, rassemblez les noms de commande sous le répertoire bin / de toutes les versions, et préparez un script shell avec le même nom dans $ PYENV_ROOT / shims. Le script shell est censé exécuter le nom de la commande pyenv exec.

La gestion de l'environnement virtuel avec ce mécanisme signifie que les commandes de l'environnement virtuel, telles que celles exécutées avec le nom de commande d'exec de bundle '' dans Bundler, entreront également des shims et seront accessibles dans le PATH. C'est. Les commandes fournies par les bibliothèques installées uniquement dans un environnement virtuel pour un projet existent toujours dans le PATH, apparaissent dans l'achèvement de la touche TAB et provoquent une erreur lors de l'exécution. (Par exemple, pyenv: pygmentize: command not found '').

En d'autres termes, la commodité de pyenv-virtualenv se fait au prix de "les commandes de l'environnement de quarantaine polluent le PATH global". Cependant, si vous faites `` pyenv uninstall virtual environment name '', les commandes qui sont uniques à cet environnement virtuel seront supprimées des shims, il est donc tout à fait possible d'arrêter progressivement pyenv-virtualenv après que les inconvénients deviennent réellement un problème. Donc je ne pense pas que vous ayez besoin d'avoir si peur.

alternative à pyenv-virtualenv

Voici une brève introduction aux outils alternatifs que vous pouvez utiliser si vous n'utilisez pas pyenv-virtualenv. Veuillez rechercher séparément l'utilisation spécifique de chaque outil.

direnv

direnv est un outil qui vous permet de personnaliser les variables d'environnement lorsque vous entrez et sortez du répertoire de votre projet.

Vous pouvez remplacer la dernière des fonctions «gestion d'environnement virtuel» et «activation automatique» fournies par pyenv-virtualenv. Par exemple, si vous écrivez dans .envrc comme suit, il activera automatiquement l'environnement virtuel appelé venv dans ce répertoire.

.envrc


source venv/bin/activate

Non limité à Python, il est pratique pour les développeurs Go de l'utiliser à des fins générales, telles que la modification du GOPATH pour chaque projet.

Utilisez venv directement

Le premier choix est d'utiliser venv directement comme décrit ci-dessus («Différences entre Bundler et venv») sans utiliser les outils de gestion d'environnement virtuel tels que virtualenvwrapper et pew décrits ci-dessous.

C'est le plus proche de la convivialité de rbenv + Bundler, donc je pense que c'est facile à comprendre. Si vous avez besoin d'une activation automatique de votre environnement virtuel, vous pouvez utiliser le direnv présenté ci-dessus.

Malheureusement, par rapport à Bundler, il n'y a pas de normes ou de normes de facto pour les noms de répertoires d'environnements virtuels tels que vendeur / bundle ou node_modules. Vous ou votre équipe devez décider lequel utiliser, tel que «venv», «.venv», «vendor / venv».

virtualenvwrapper

virtualenvwrapper est un outil de gestion d'environnement virtuel qui a longtemps été utilisé par les grands développeurs Python.

Vous pouvez créer, supprimer ou activer un environnement virtuel dans le répertoire spécifié par la variable d'environnement WORKON_HOME (ou `$ HOME / .virtualenvs si non spécifié).

pew

pew est similaire à virtualenvwrapper, mais utilise sa propre implémentation plutôt que la commande fournie par venv pour activer l'environnement virtuel. Plus précisément, au lieu de personnaliser le shell actuel, exécutez le shell personnalisé en tant que processus enfant. Vous pouvez revenir à l'environnement d'origine en fermant le shell enfant avec Ctrl-D au lieu de la commande `` désactiver ''.

Si vous installez pew, un outil appelé pythonz, qui construit et gère plusieurs versions de Python en conflit avec pyenv, sera installé en tant que dépendance, mais comme la mise à jour est plus lente que pyenv, vous pouvez utiliser pyenv sans vous en soucier. pense.

pipenv

Un nouvel outil facile à utiliser comme Bundler. Au lieu du fichier d'exigences utilisé par pip, gérez la bibliothèque à l'aide d'un fichier basé sur TOML plus sophistiqué appelé Pipfile. Notez que Pipfile est toujours un outil expérimental et que le format peut changer à l'avenir, vous devez donc vous y préparer. (Je ne pense pas que ça change si souvent)

Par défaut, pew est utilisé pour gérer l'environnement virtuel, mais si vous définissez `` PIPENV_VENV_IN_PROJECT = true '' et la variable d'environnement, le répertoire .venv sous le projet sera utilisé, donc plus de Bundler Je pense que ce sera plus proche de la convivialité.

Comment utiliser pyenv uniquement pour construire Python

Si vous ne souhaitez pas utiliser la fonction de changement de version de pyenv telle que pyenv local, vous pouvez trouver `ʻecho'eval" dans instructions d'installation de pyenv. Vous pouvez alléger le shell et ne pas utiliser de shims en omettant "$ (pyenv init -)" '>> ~ / .bash_profile. Si vous omettez cette étape, pyenv install '', pyenv uninstall '', pyenv versions '' fonctionnera correctement.

Au lieu de `` pyenv global '', c'est une bonne idée d'aller directement dans votre PATH pour votre version Python habituelle.

$ echo 'export PATH=$PYENV_ROOT/versions/3.6.1/bin:${PATH}' >> ~/.bash_profile

Si vous êtes accro, vous pouvez faire de votre Python ordinaire un environnement virtuel pour garder le Python construit par pyenv propre.

$ $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

Ce que Rubyist doit savoir lors de l'utilisation de pyenv
Ce que je suis entré lors de l'utilisation de Tensorflow-gpu
Ce que chaque programmeur doit savoir sur la mémoire
Ce que les utilisateurs d'Emacs doivent savoir lors de l'écriture de code Python dans Sublime Text
Qu'utilisez-vous lorsque vous testez avec Python?
Méthode d'installation lors de l'utilisation de RealSense à partir de Python (édition pyenv)
Causes lorsque la version de Python ne peut pas être modifiée à l'aide de pyenv
Conseils à savoir lors de la programmation de compétitions avec Python2
Notes minimales lors de l'utilisation de Python sur Mac (édition pyenv)
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
Résumé lors de l'utilisation de Fabric
Précautions lors de l'utilisation de Chainer
Qu'est-ce qui a été demandé lors de l'utilisation de Random Forest dans la pratique
Liste des bibliothèques à installer lors de l'installation de Python à l'aide de Pyenv