Comment Pipfile et Pipfile.lock sont-ils utilisés?

132

Il semble que Pipfile / Pipfile.lock sont destinés à remplacer requirements.txt, dans le contexte de l'empaquetage Python. Cependant, il n'y a pas beaucoup de documentation sur leur fonctionnement réel. J'ai trouvé une description évolutive de pipfile dans la section PyPi du site Web Python ici, mais elle est assez compliquée et n'explique pas la sémantique des différentes sections du fichier.

Des conseils sur la façon de comprendre ces fichiers?

Stephen
la source
2
Ceci est un analogue direct de Gemfileet Gemfile.lockdu monde Ruby: Le .lockfichier a des versions spécifiques pour chaque dépendance; celui sans cette extension n'a que les versions connues des humains qui contrôlent. Cela dit, demander une explication sur quelque chose qui est encore en évolution et qui est loin d'être bien défini, beaucoup moins standardisé, est peut-être un peu prématuré.
Charles Duffy
(Et de même, la différence entre Pipfileet requirements.txtest en grande partie que le premier essaie d'adopter des fonctionnalités du monde Ruby, c'est-à-dire être capable de spécifier des ensembles de dépendances pour plusieurs environnements et avec des conditions / options / etc. dans un seul fichier).
Charles Duffy
1
Il semble qu'il ait déjà été déployé dans le repo Heroku " Getting started with Python" ( github.com/heroku/python-getting-started.git ) donc que ça plaise ou non, il semble qu'il soit en production.
Stephen
Je t'ai eu. Cela dit, les documents me semblent assez solides. Je ne sais pas ce que je pourrais écrire dans une réponse qui ne serait pas simplement les reformuler.
Charles Duffy
1
Si vous faites référence au lien que j'ai créé dans le PO, il y a un certain nombre de choses omises, par exemple ce que cela signifie réellement pour quelque chose d'être dans une section appelée source.
Stephen

Réponses:

166

Le concept derrière ces fichiers est simple et analogue à d'autres outils déjà existants, si vous avez une certaine familiarité avec Ruby's Bundler ou Node's Npm. Pipenvest à la fois un outil de gestion de packages et d'environnement virtuel qui utilise les fichiers Pipfile et Pipfile.lock pour atteindre ces objectifs.

Pipenv gère l'environnement virtuel pour vous d'une manière standard par défaut (plus besoin d'activer et de désactiver). Ci-dessous, quelques notions de base pour commencer, en savoir plus sur le site Web de pipenv .

Commencer

Commencer à utiliser pipenv est simple, dans le type de dossier de votre projet ...

$ pipenv install

... et s'il a déjà un requirements.txtfichier, il générera un Pipfilefichier avec les exigences et un dossier d'environnement virtuel, sinon, il générera un Pipfilefichier vide . Si vous n'avez pas aimé ou changé d'avis sur quelque chose que vous avez installé, tapez simplement ...

$ pipenv uninstall <package>

... et vous êtes prêt à partir. Pour activer l'environnement virtuel que pipenv a déjà généré, allez avec ...

$ pipenv shell

... et votre environnement virtuel sera activé. Pour quitter l'environnement ...

$ exit

... et vous serez de retour à votre session de terminal d'origine.

Pipfile

Le fichier Pipfile est destiné à spécifier les exigences des packages pour votre application ou bibliothèque Python, à la fois pour le développement et l'exécution. Vous pouvez installer un package en utilisant simplement ...

$ pipenv install flask

... et il sera ajouté en tant que dépendance pour le déploiement et l'exécution ou en utilisant ...

$ pipenv install --dev pytest

... et il sera utilisé comme une dépendance pour le temps de développement. La syntaxe du fichier est assez simple, comme suit.

[[source]] # Here goes your package sources (where you are downloading your packages from).
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages] # Here goes your package requirements for running the application and its versions (which packages you will use when running the application).
requests = "*"
flask = "*"
pandas = "*"

[dev-packages] # Here goes your package requirements for developing the application and its versions (which packaes you will use when developing the application)
pylint = "*"
wheel = "*"

[requires] # Here goes your required Python version.
python_version = "3.6"

Pipfile.lock

Le Pipfile.lock est destiné à spécifier, en fonction des packages présents dans Pipfile , quelle version spécifique de ceux-ci doit être utilisée, en évitant les risques de mise à niveau automatique des packages qui dépendent les uns des autres et de rupture de l'arborescence de dépendances de votre projet.

Vous pouvez verrouiller vos packages actuellement installés en utilisant ...

$ pipenv lock

... et l'outil recherchera votre dossier d'environnement virtuel pour générer automatiquement le fichier de verrouillage pour vous, en fonction des versions actuellement installées. La syntaxe du fichier n'est pas aussi évidente que pour Pipfile , donc par souci de concision, elle ne sera pas affichée ici.

danieldeveloper001
la source
C'est une réponse intéressante, mais je pense que lorsque je posais la question, je ne pouvais pas tout à fait comprendre ce que cela signifiait réellement [[source]], comme est-ce la source des paquets téléchargés par pipenv ou autre chose? Je suppose que le reste des deux fichiers est assez évident.
Stephen
1
J'admets que j'ai trouvé cela déroutant car je travaille sur un tutoriel où je dois décider si la différence [package] / [dev-package] est importante, ou si je dois simplement tout mettre dans [package]. (Googler pour cela est ce qui m'a conduit à cette page.) Mais avoir les deux en mettant des éléments de développement dans [package] m'a en quelque sorte jeté. Je pouvais voir pourquoi les demandes devraient être dans [package].
Al Sweigart
1
Modifié, comme demandé, pour éviter toute confusion sur les packages de développement, merci pour votre commentaire, j'espère que c'est moins déroutant maintenant :)
danieldeveloper001
1
Je pense que c'est une bonne idée, si vous voulez garder une trace de ses versions de package tout au long de l'évolution du code source, car la plupart des packages seront mis en vedette Pipfile. Si quelque chose se casse lors d'une mise à niveau d'un package, on devrait alors être en mesure de le réparer en examinant l'historique des versions du package, et en effet, l'un des créateurs de la bibliothèque de requêtes recommande de le faire ici .
danieldeveloper001
1
@Stephen, c'est en fait le contraire, comme indiqué dans la documentation d'installation de pipenv, vous pouvez spécifier le --skip-lockdrapeau pour le forcer à ignorer le Pipfile.lockfichier plutôt que de le forcer à l'utiliser;)
danieldeveloper001