Quel est l'équivalent de pip de `npm install package --save-dev`?

199

Dans nodejs, je peux faire npm install package --save-devpour enregistrer le package installé dans le package.

Comment puis-je réaliser la même chose dans le gestionnaire de packages Python pip? Je voudrais enregistrer le nom du package et sa version dans, disons, requirements.pipjuste après l'installation du package en utilisant quelque chose comme pip install package --save-dev requirements.pip.

hllau
la source
4
pip freeze > requirements.pip
falsetru
5
Ce n'est pas pareil. npm install package --save-devcombine à la fois l'installation et l'ajout au fichier d'exigences node_npm. C'est plus pratique. Avec pip freezeje dois faire deux commandes pour faire la même chose: 1) pip install package2)pip freeze > requirements.pip
hllau
1
Pip a un problème avec l' --saveoption.
rutsky
Si vous utilisez setup.py pour les exigences, j'ai créé un petit module pour figer vos versions de package dans setup.py.
AdamGold

Réponses:

164

Il n'y a pas d'équivalent avec pip.

Le meilleur moyen est de pip install package && pip freeze > requirements.txt

Vous pouvez voir toutes les options disponibles sur leur page de documentation .

Si cela vous dérange vraiment, il ne serait pas trop difficile d'écrire un script bash personnalisé ( pips) qui prend un -sargument et se fige requirements.txtautomatiquement dans votre fichier.

Modifier 1

Depuis l'écriture de ce document, il n'y a eu aucun changement dans la fourniture d'une --save-devoption automatique similaire à NPM, mais Kenneth Reitz (auteur de requestset bien d'autres) a publié plus d'informations sur un meilleur flux de travail pip pour mieux gérer les pipmises à jour.

Modifier 2

Lié à l'article «Better pip workflow» ci-dessus, il est désormais recommandé de l'utiliser pipenvpour gérer les exigences et les environnements virtuels. Ayant beaucoup utilisé cela récemment, je voudrais résumer la simplicité de la transition:

Installer pipenv(sur Mac)

brew install pipenv

pipenvcrée et gère ses propres environnements virtuels donc dans un projet avec un existant requirements.txt, l'installation de toutes les exigences (j'utilise Python3.7 mais vous pouvez supprimer le --threesi vous ne le faites pas) est aussi simple que:

pipenv --three install

L'activation de virtualenv pour exécuter des commandes est également facile

pipenv shell

Exigences de l' installation mettra à jour automatiquement PipfileetPipfile.lock

pipenv install <package>

Il est également possible de mettre à jour des packages obsolètes

pipenv update

Je recommande fortement de le vérifier surtout si vous venez d'un npmarrière - plan car il a une sensation similaire à package.jsonetpackage-lock.json

Ewan
la source
22
Notez que cela enregistrera également les dépendances des dépendances qui, au fil du temps, pourraient ne plus être nécessaires car la dépendance a abandonné son utilisation.
Patrick Bassut
Cela ne semble pas aborder l'aspect --save-dev de la question d'origine qui vous permet d'avoir différentes dépendances pour le développement local par rapport à la production. Comment pouvez-vous y parvenir avec pipenv?
jeznag
1
@jeznag pipenvvous permet de spécifier un dev-packagesdans votre Pipfileet / ou utiliser --dev(ou -d) à partir de la ligne de commande. par exemplepipenv install --dev nose2
Ewan
39

Cette simple ligne est un point de départ. Vous pouvez facilement créer une commande bash pour réutiliser le PACKAGE dans la ligne.

pip install PACKAGE && pip freeze | grep PACKAGE >> requirements.txt

Merci à @devsnd pour l'exemple de fonction bash simple:

function pip-install-save { 
    pip install $1 && pip freeze | grep $1 >> requirements.txt
}

Pour l'utiliser, lancez simplement:

pip-install-save some-package
Karim N Gorjux
la source
Mes cinq centsP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian
4

J'ai créé un package python qui entoure le pipmpip appelé . Toutes les commandes fonctionneront telles quelles, et elles seront reflétées dans le fichier des exigences. Contrairement à (outil similaire que j'ai trouvé et que je n'ai pas pu utiliser), il peut gérer de nombreux fichiers et environnements (test, développement, production, etc.). Il a également la commande de mettre à niveau toutes / toutes vos dépendances.pippip-save

installation

pipm install pkg-name

installation en tant que dépendance de développement

pipm install pkg-name --dev

installation comme test de dépendance

pipm install pkg-name --test

suppression

pipm uninstall pkg-name

mettre à jour toutes vos dépendances

pipm update

installez toutes vos dépendances à partir du fichier d'exigences

pipm install

y compris les dépendances de développement

pipm install --dev

Noortheen Raja
la source
3

Mise à jour: apparemment, pipenv n'est pas officiellement approuvé par les responsables de Python et la page précédemment liée appartient à une autre organisation. L'outil a ses avantages et ses inconvénients, mais la solution ci-dessous atteint toujours le résultat recherché par le PO.

pipenv est un outil de gestion des dépendances qui encapsule pipet, entre autres, fournit ce que vous demandez:

https://pipenv.kennethreitz.org/en/latest/#example-pipenv-workflow

$ pipenv install <package>

Cela créera un fichier Pipfile s'il n'en existe pas. S'il en existe un, il sera automatiquement modifié avec le nouveau package que vous avez fourni.

A Pipfileest un équivalent direct de package.json, tandis que Pipfile.lockcorrespond à package-lock.json.

dskrvk
la source
1

vous pouvez l' enregistrer manuellement dans un Makefile (ou un fichier texte puis importé dans votre Makefile):


PYTHON=.venv/bin/python # path to pyphon
PIP=.venv/bin/pip # path to pip
SOURCE_VENV=. .venv/bin/activate


install:
    virtualenv .venv
    $(SOURCE_VENV) && $(PIP) install -e PACKAGE
    $(SOURCE_VENV) && $(PIP) install -r requirements.txt # other required packages

puis exécutez make install

Evan Lévesque
la source
Je suis totalement d'accord avec cette approche.
eleijonmarck
1

J'utilise cette petite ligne de commande pour installer un package et enregistrer sa version dans requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt

Anthony Pierotti
la source
0

Que diriez-vous de faire une fonction shell pour ce faire? Ajoutez le code ci-dessous à votre ~/.profileou~/.bashrc

pips() {
    local pkg=$1

    if [ -z "$1" ]; then
        echo "usage: pips <pkg name>"
        return 1
    fi

    local _ins="pip install $pkg"
    eval $_ins
    pip freeze | grep $pkg -i >> requirements.txt
}

puis lancez source ~/.profileou source ~/.bashrcpour l'importer sur votre terminal actuel

lorsque vous souhaitez installer et enregistrer un package, lancez simplement, par exemple pips requests. une fois le package installé, sa version sera enregistrée dans requirements.txtvotre répertoire actuel.

Anyany Pan
la source