[PYTHON] J'ai essayé d'utiliser Pipenv

introduction

Cela fait environ six mois que j'ai découvert «Pipenv» et que j'ai commencé à l'utiliser. Je vais résumer ce que j'ai trouvé pratique.

Pour faire simple, «Pipenv» est pratique, donc tout le monde devrait l'essayer.

Jusque là

Jusqu'à ce que je découvre l'existence de «Pipenv», j'ai utilisé «venv» pour créer un environnement virtuel et je l'ai géré en installant les modules décrits dans «requirements.txt» avec «pip».

requirements.txt


requests==2.22.0

Préparez un tel fichier

$ python3 -m venv venv
$ ./venv/bin/python -m pip install -r requirements.txt
Collecting requests==2.22.0 (from -r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/51/bd/23c926cd341ea6b7dd0b2a00aba99ae0f828be89d72b2190f27c11d4b7fb/requests-2.22.0-py2.py3-none-any.whl
Collecting idna<2.9,>=2.5 (from requests==2.22.0->-r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/14/2c/cd551d81dbe15200be1cf41cd03869a46fe7226e7450af7a6545bfc474c9/idna-2.8-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests==2.22.0->-r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/b9/63/df50cac98ea0d5b006c55a399c3bf1db9da7b5a24de7890bc9cfd5dd9e99/certifi-2019.11.28-py2.py3-none-any.whl
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 (from requests==2.22.0->-r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/b4/40/a9837291310ee1ccc242ceb6ebfd9eb21539649f193a7c8c86ba15b98539/urllib3-1.25.7-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests==2.22.0->-r requirements.txt (line 1))
  Using cached https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl
Installing collected packages: idna, certifi, urllib3, chardet, requests
Successfully installed certifi-2019.11.28 chardet-3.0.4 idna-2.8 requests-2.22.0 urllib3-1.25.7

Quelque chose comme ça.

Pour exécuter du code dans cet environnement, soit source. / Venv / bin / activate, soit spécifiez directement. / Venv / bin / python.

Problèmes jusqu'à présent

Il y avait quelques problèmes avec la gestion des modules jusqu'à présent.

Difficile de comprendre de quels modules dépendent

requirements.txt


requests==2.22.0

Au début, je craignais que la version du module dépendant ne puisse être corrigée avec cette façon d'écrire requirements.txt. Cependant, la commande pip a une sous-commande appelée freeze, qui affiche tous les modules actuellement installés dans un format qui peut être décrit dans requirements.txt.

En conséquence, mon requirements.txt ressemble à ceci.

requirements.txt


certifi==2019.11.28
chardet==3.0.4
idna==2.8
pkg-resources==0.0.0
requests==2.22.0
urllib3==1.25.7

Vous pouvez maintenant spécifier la version de tous les modules dépendants! Mais le gros problème ici est

** Je ne connais pas du tout les dépendances du module **

Comme je l'expliquerai plus tard, à cet égard, je suis devenu un organisme dont «Pipenv» ne peut pas se séparer.

Le requirements.txt actuel répertorie juste tous les modules installés, donc je ne connais pas les dépendances de chacun. De plus, selon le projet, les fichiers peuvent être séparés en dev-requirements.txt et build-requirements.txt (comme ce fut le cas avec le projet que je développe). J'ai eu du mal à donner une version du module. Je ne sais pas de quel package il dépend, donc je l'ai installé dans un autre environnement et vérifié les packages dépendants.

Il est difficile d'exécuter le code

Jusqu'à ce que je crée l'environnement virtuel et exécute le code, j'ai suivi les étapes suivantes:

$ python3 -m venv venv  #Créer un environnement virtuel
$ ./venv/bin/pip install -U setuptools pip wheel  #Mettez à jour le module de base avec la dernière version
$ ./venv/bin/pip install -r requirements.txt  #Installation des modules requis
$ ./venv/bin/python main.py  #Exécution de code dans un environnement virtuel

Quoi! Ce serait bien de conserver l'environnement venv une fois créé, mais ce n'est pas le cas.

Ne vous inquiétez pas si vous utilisez Makefile

J'utilise Makefile pour rendre cela possible avec une seule commande.

Makefile


venv:
  python3 -m venv venv
  ./venv/bin/pip install -U setuptools pip wheel
  ./venv/bin/pip install -r requirements.txt

.PHONY: run
run:
  ${MAKE} venv
  ./venv/bin/python main.py

Vous pouvez maintenant exécuter votre code à tout moment avec make run.

J'ai appris à connaître Pipenv

Un jour, j'ai rencontré «Pipenv». .. ..

https://pipenv-ja.readthedocs.io/ja/translate-ja/

La documentation officielle de Pipenv est très bonne. C'est japonais et facile à lire. Personnellement, cela a été d'une grande aide.

Les bons points de Pipenv

Vous pouvez voir la fonction de Pipenv en consultant la documentation officielle. Ici, essayez d'utiliser Pipenv et utilisez la méthode de gestion jusqu'à présent. Voici quelques-unes des fonctionnalités que j'ai trouvées utiles.

Dépendances de module faciles à comprendre

Il n'est pas exagéré de dire que j'ai écrit cet article parce que je voulais le dire.

Bien que cela ne soit pas mentionné en détail ici, Pipenv gère les modules dans un fichier appelé Pipfile au lieu de requirements.txt. Ce fichier est généré automatiquement lorsque vous exécutez la commande pipenv, vous n'aurez donc peut-être pas la possibilité de le modifier directement.

Pipfile


[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
requests = "==2.22.0"

[requires]
python_version = "3.6"

Maintenant, essayez d'exécuter la commande pipenv graph.

$ pipenv graph
requests==2.22.0
  - certifi [required: >=2017.4.17, installed: 2019.11.28]
  - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  - idna [required: >=2.5,<2.9, installed: 2.8]
  - urllib3 [required: >=1.21.1,<1.26,!=1.25.1,!=1.25.0, installed: 1.25.7]

** Non seulement vous pouvez vérifier les modules installés, mais vous pouvez également voir les dépendances de chacun. ** ** Cela a été personnellement très apprécié.

Comme vous pouvez voir la version requise pour chaque module, vous n'avez pas à vérifier les dépendances à chaque fois que vous souhaitez modifier la version.

Code facile à exécuter

Lorsque vous utilisez Pipenv, vous pouvez créer un environnement virtuel → installer les modules nécessaires → exécuter du code dans l'environnement virtuel avec la commande suivante.

$ pipenv install  #Créer un environnement virtuel+Installation des modules requis
$ pipenv run python main.py   #Principal dans un environnement virtuel.Exécuter py

Le nombre de commandes est clairement réduit par rapport à la procédure introduite dans [Troublesome to execute code](#Troublesome pour exécuter du code). Avec ce montant, vous n'avez pas à vous soucier d'utiliser Makefile.

les scripts peuvent être définis

En définissant une section appelée «scripts» dans «Pipfile», vous pouvez définir des instructions fréquemment exécutées comme des commandes. Cliquez ici pour plus de détails (https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#custom-script-shortcuts) (Officiel)

Par exemple, le Pipfile qui définit la commande pour exécuter le test est le suivant.

Pipfile


[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
pytest = "==5.3.1"

[packages]
requests = "==2.22.0"

[requires]
python_version = "3.6"

[scripts]
test = "python -m pytest tests/"

Une section appelée «[scripts]» a été ajoutée.

Il vous permet de définir des sous-commandes qui suivent la commande pipenv run, auquel cas le test pipenv run exécutera le test avec le pytest. Les commandes fréquemment utilisées telles que l'exécution de test et l'empaquetage ont été décrites dans Makefile, mais si vous l'utilisez, vous n'avez besoin que d'un Pipfile pour exécuter du code simple.

Lit le fichier .env

Lorsque vous exécutez le code avec pipenv run, il chargera automatiquement le fichier .env. Cliquez ici pour plus de détails (https://pipenv-ja.readthedocs.io/ja/translate-ja/advanced.html#automatic-loading-of-env) (Officiel)

C'est aussi sobre.

J'utilise cette fonction comme un fichier de configuration. Écrivez la valeur dans le fichier «.env» au format «clé = valeur» afin que le code lise la valeur de la variable d'environnement.

.env


KEY=VALUE

main.py


import os
key = os.environ.get("KEY")
print(key)  # VALUE

Tout comme le fichier de paramètres, éditer simplement le fichier dans .env changera le résultat de l'exécution.

$ pipenv run python main.py
VALUE

Si l'échelle du code devient grande, il est préférable de créer un mécanisme pour lire correctement le fichier de paramétrage, Cette fonction est très utile car il est difficile d'écrire le code pour lire le fichier de paramètres en utilisant ConfigParser etc. pour le petit code.

Essayez d'utiliser Pipenv

Si vous utilisez Python et que vous n'avez jamais entendu parler de Pipenv, essayez-le.

Recommended Posts

J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser anytree
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé d'utiliser ESPCN
J'ai essayé d'utiliser openpyxl
J'ai essayé d'utiliser Ipython
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé d'utiliser Jupyter
J'ai essayé d'utiliser doctest
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé d'utiliser pipenv, alors prenez note
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'utiliser easydict (mémo).
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé d'utiliser RandomForest
J'ai essayé d'utiliser BigQuery ML
J'ai essayé d'utiliser Amazon Glacier
J'ai essayé d'utiliser git inspector
J'ai essayé d'utiliser magenta / TensorFlow
J'ai essayé d'utiliser AWS Chalice
J'ai essayé d'utiliser l'émojinateur Slack
J'ai essayé d'utiliser Rotrics Dex Arm # 2
J'ai essayé d'utiliser Rotrics Dex Arm
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé d'utiliser Thonny (Python / IDE)
J'ai essayé de communiquer avec le client serveur en utilisant tmux
J'ai essayé l'apprentissage par renforcement avec PyBrain
J'ai essayé l'apprentissage en profondeur avec Theano
J'ai essayé d'utiliser le notebook jupyter d'une manière ou d'une autre
[Kaggle] J'ai essayé le sous-échantillonnage en utilisant un apprentissage déséquilibré
J'ai essayé de photographier une vague de tortue en utilisant OpenPose
J'ai essayé d'utiliser l'API checkio
J'ai essayé le traitement asynchrone en utilisant asyncio
J'ai essayé PyQ
J'ai essayé AutoKeras
J'ai essayé le moulin à papier
J'ai essayé django-slack
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'utiliser Azure Speech to Text.
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
J'ai essayé d'utiliser l'API de données YOUTUBE V3