J'ai un fichier d'exigences pip qui change pendant le développement.
Peut- pip
on désinstaller les packages qui n'apparaissent pas dans le fichier des exigences et installer ceux qui apparaissent? Existe-t-il une méthode standard?
Cela permettrait au fichier d'exigences pip d'être la liste canonique des paquets - une approche «si et seulement si».
Mise à jour : je l'ai suggéré comme nouvelle fonctionnalité sur https://github.com/pypa/pip/issues/716
Réponses:
La réponse courte est non, vous ne pouvez pas faire cela avec pip.
la source
pip uninstall -r requirements.txt
-y
à @Ommit pour éviter d'avoir à appuyer sur Y et à saisir plusieurs fois. Apprenez de mes erreurs.pip uninstall -r requirements.txt
ne désinstallera que les versions de votre requirements.txt. Si vous désinstallezboto3==1.10.0
par exemple,pip freeze
s'afficheboto3==1.0.1
si vous l'avez déjà installé (ou une version plus ancienne).Cela devrait désinstaller tout ce qui ne figure pas dans requirements.txt:
pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y
Bien que cela ne fonctionne pas tout à fait correctement avec les paquets installés avec
-e
, c'est-à-dire à partir d'un dépôt git ou similaire. Pour les ignorer, il suffit de filtrer les paquets commençant par l'-e
indicateur:pip freeze | grep -v -f requirements.txt - | grep -v '^#' | grep -v '^-e ' | xargs pip uninstall -y
Ensuite, évidemment:
Mise à jour pour 2016: vous ne voulez probablement pas vraiment utiliser l'approche ci-dessus, cependant. Découvrez
pip-tools
etpip-sync
qui accomplissent ce que vous cherchez probablement à faire d'une manière beaucoup plus robuste.https://github.com/nvie/pip-tools
Mise à jour pour mai 2016:
Vous pouvez maintenant également utiliser
pip uninstall -r requirements.txt
, mais cela accomplit fondamentalement le contraire - il désinstalle tout dansrequirements.txt
Mise à jour pour mai 2019:
Découvrez pipenv . Beaucoup de choses se sont passées dans le monde de la gestion des paquets qui rendent ce genre de question un peu obsolète. En fait, j'utilise toujours avec plaisir les outils pip.
la source
project.config
fichier pour Django sur Elastic Beanstalk:05_pip_clean: command: "pip freeze | grep -v -f requirements.txt - | grep -v '^#' | xargs pip uninstall -y"
. Maintenant, je peux restaurer les packages pip sans reconstruire mon environnement simplement en utilisant des commentaires dansrequirements.txt
. Cela me fait gagner un temps d'arrêt réel. Merci!pip freeze
fait des commentaires, mais un jour, ils peuvent l'ajouter à l'API, et s'ils le font, ce sera valide. S'ils ne le font pas, alors ce qui précède est interdit. Le tiret vous permet d'utiliser stdin de la commande précédente, dans ce cas, le tiret indique à grep de comparer le contenu de requirements.txt à la sortie depip freeze
(la sortie depip freeze
dans ce contexte est synonyme de stdin)Ce n'est pas une caractéristique de
pip
, non. Si vous voulez vraiment une telle chose, vous pouvez écrire un script pour comparer la sortiepip freeze
avec le vôtrerequirements.txt
, mais ce serait probablement plus compliqué que cela ne vaut la peine.En utilisant
virtualenv
, il est plus facile et plus fiable de créer simplement un environnement propre et de (ré) installer à partir derequirements.txt
, comme:la source
requirements.txt
), pourquoi serait-il jamais réinstallé ?Vous pouvez maintenant passer l'
-r requirements.txt
argument àpip uninstall
.Au moins à partir de
pip
8.1.2,pip help uninstall
montre:... Uninstall Options: -r, --requirement <file> Uninstall all the packages listed in the given requirements file. This option can be used multiple times. ...
la source
C'est une vieille question (mais bonne), et les choses ont considérablement changé depuis qu'elle a été posée.
Il y a une référence désinvolte à
pip-sync
une autre réponse, mais mérite sa propre réponse, car elle résout précisément le problème du PO.pip-sync prend un
requirements.txt
fichier comme entrée, et «vérifie» votre environnement Python actuel afin qu'il corresponde exactement à ce qu'il contientrequirements.txt
. Cela inclut la suppression de tous les packages présents dans votre env mais absents derequirements.txt
.Exemple: Supposons que nous voulons que notre env contienne (seulement) 3: bibliothèques
libA
,libB
etlibC
, comme ceci:> cat requirements.txt libA==1.0 libB==1.1 libC==1.2
Mais notre env contient actuellement
libC
etlibD
:> pip freeze libC==1.2 libD==1.3
L'exécution de pip-sync entraînera ceci, qui était notre état final souhaité:
> pip-sync requirements.txt > pip freeze libA==1.0 libB==1.1 libC==1.2
la source
La proposition de Stephen est une bonne idée, mais malheureusement cela ne fonctionne pas si vous n'incluez que des exigences directes dans votre fichier, ce qui me semble plus clair.
Toutes les dépendances seront désinstallées, y compris même
distribute
, se décomposantpip
.Maintenir un fichier d'exigences propre tout en suivant la version d'un environnement virtuel
Voici comment j'essaie de suivre les versions de mon environnement virtuel. J'essaie de maintenir un minimum
requirements.txt
, en incluant uniquement les exigences directes, et en ne mentionnant même pas les contraintes de version là où je ne suis pas sûr.Mais en plus, je garde, et j'inclus dans le suivi de version (disons git), le statut réel de mon virtualenv dans un
venv.pip
fichier.Voici un exemple de workflow:
configuration de l'espace de travail virtualenv, avec suivi des versions:
initialiser le système de suivi de version:
git init echo venv > .gitignore pip freeze > venv.pip git add .gitignore venv.pip git commit -m "Python project with venv"
installez un package avec des dépendances, incluez-le dans le fichier des exigences:
Maintenant, commencez à créer votre application, puis validez et démarrez une nouvelle branche:
vim myapp.py git commit -am "Simple flask application" git checkout -b "experiments"
installez un package supplémentaire:
... jouez avec, puis revenez à la version précédente
vim manage.py git commit -am "Playing with flask-script" git checkout master
Désinstallez maintenant les packages superflus:
Je suppose que le processus peut être automatisé avec des hooks git, mais ne sortons pas du sujet.
Bien sûr, il est logique d'utiliser un système de mise en cache de paquets ou un référentiel local comme pip2pi
la source
Piggybacking off @ stephen-j-fuhry voici un équivalent PowerShell que j'utilise:
pip freeze | ? { $_ -notmatch ((gc req.txt) -join "|") }
la source
Bien que cela ne réponde pas directement à la question, une meilleure alternative à
requirements.txt
maintenant consiste à utiliser unPipfile
. Cela fonctionne de la même manière qu'un RubyGemfile
. Actuellement, vous devez utiliser l'pipenv
outil, mais j'espère que cela sera éventuellement intégré àpip
. Cela fournit lapipenv clean
commande qui fait ce que vous voulez.(Notez que vous pouvez importer un existant
requirements.txt
avecpipenv install -r requirements.txt
. Après cela, vous devriez avoir unPipfile
et lerequirements.txt
peut être supprimé.)la source
Il est désormais possible d'utiliser:
la source