Was entspricht pip dem `npm install package --save-dev`?

198

In nodejs kann ich npm install package --save-devdas installierte Paket im Paket speichern.

Wie erreiche ich dasselbe im Python-Paketmanager pip? Ich möchte den Paketnamen und seine Version beispielsweise requirements.pipunmittelbar nach der Installation des Pakets mit so etwas wie speichern pip install package --save-dev requirements.pip.

hllau
quelle
4
pip freeze > requirements.pip
Falsetru
5
Das ist nicht dasselbe. npm install package --save-devkombiniert sowohl die Installation als auch das Hinzufügen zur Anforderungsdatei node_npm gleichzeitig. Es ist praktischer. Mit pip freezemuss ich zwei Befehle ausführen, um dasselbe zu tun: 1) pip install package2)pip freeze > requirements.pip
hllau
1
Pip hat ein Problem mit der --saveOption.
Rutsky
Wenn Sie setup.py für Anforderungen verwenden, habe ich ein kleines Modul erstellt , um Ihre Paketversionen in setup.py einzufrieren.
AdamGold

Antworten:

163

Es gibt kein Äquivalent zu pip.

Der beste Weg ist zu pip install package && pip freeze > requirements.txt

Sie können alle verfügbaren Optionen auf ihrer Dokumentationsseite sehen .

Wenn es Sie wirklich stört, ist es nicht allzu schwierig, ein benutzerdefiniertes Bash-Skript ( pips) zu schreiben , das ein -sArgument aufnimmt und requirements.txtautomatisch in Ihre Datei einfriert .

Bearbeiten 1

Seitdem dies geschrieben wurde, hat sich nichts an der Bereitstellung einer --save-devNPM-ähnlichen Auto- Option geändert. Kenneth Reitz (Autor von requestsund viele weitere) hat jedoch weitere Informationen zu einem besseren Pip-Workflow veröffentlicht , um pipAktualisierungen besser handhaben zu können .

Bearbeiten 2

In Verbindung mit dem obigen Artikel "Besserer Pip-Workflow" wird jetzt empfohlen pipenv, Anforderungen und virtuelle Umgebungen zu verwalten. Nachdem ich dies in letzter Zeit häufig verwendet habe, möchte ich zusammenfassen, wie einfach der Übergang ist:

Installieren pipenv(auf Mac)

brew install pipenv

pipenvErstellt und verwaltet seine eigenen virtuellen Umgebungen. In einem Projekt mit einer vorhandenen Umgebung requirements.txtist die Installation aller Anforderungen (ich verwende Python3.7, aber Sie können die entfernen, --threewenn Sie dies nicht tun) so einfach wie:

pipenv --three install

Das Aktivieren der virtuellen Umgebung zum Ausführen von Befehlen ist ebenfalls einfach

pipenv shell

Durch die Installation der Anforderungen werden das Pipfileund automatisch aktualisiertPipfile.lock

pipenv install <package>

Es ist auch möglich, veraltete Pakete zu aktualisieren

pipenv update

Ich empfehle dringend , es auszuprobieren, insbesondere wenn es aus einem npmHintergrund stammt, da es sich ähnlich anfühlt wie package.jsonundpackage-lock.json

Ewan
quelle
22
Beachten Sie, dass dadurch auch Abhängigkeiten von Abhängigkeiten gespeichert werden, die im Laufe der Zeit möglicherweise nicht mehr benötigt werden, da die Abhängigkeit die Verwendung dieser Abhängigkeiten eingestellt hat.
Patrick Bassut
Dies scheint nicht den --save-dev-Aspekt der ursprünglichen Frage anzusprechen, der es Ihnen ermöglicht, unterschiedliche Abhängigkeiten zwischen lokaler Entwicklung und Produktion zu haben. Wie können Sie das mit pipenv erreichen?
Jeznag
1
Mit @jeznag pipenvkönnen Sie ein dev-packagesin Ihrem Pipfileund / oder verwenden --dev(oder -d) über die Befehlszeile angeben . zBpipenv install --dev nose2
Ewan
39

Diese einfache Linie ist ein Ausgangspunkt. Sie können einfach einen Bash-Befehl erstellen, um das PAKET in der Zeile wiederzuverwenden.

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

Vielen Dank an @devsnd für das einfache Bash-Funktionsbeispiel:

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

Um es zu verwenden, führen Sie einfach Folgendes aus:

pip-install-save some-package
Karim N Gorjux
quelle
Meine fünf CentP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian
4

Ich habe ein Python-Paket erstellt, das sich um das tatsächlich pipals pipm bezeichnete Paket dreht . Alle pipBefehle funktionieren unverändert und werden in der Anforderungsdatei wiedergegeben. Im Gegensatz zu pip-save(ein ähnliches Tool, das ich gefunden habe und das ich nicht verwenden konnte) kann es viele Dateien und Umgebungen (Test, Entwicklung, Produktion usw.) verarbeiten. Es hat auch den Befehl, alle / einige Ihrer Abhängigkeiten zu aktualisieren.

Installation

pipm install pkg-name

Installation als Entwicklungsabhängigkeit

pipm install pkg-name --dev

Installation als Testabhängigkeit

pipm install pkg-name --test

Entfernung

pipm uninstall pkg-name

Aktualisieren Sie alle Ihre Abhängigkeiten

pipm update

Installieren Sie alle Ihre Abhängigkeiten aus der Anforderungsdatei

pipm install

einschließlich Entwicklungsabhängigkeiten

pipm install --dev

Noortheen Raja
quelle
3

Update: Anscheinend wird pipenv nicht offiziell von Python-Betreuern empfohlen , und die zuvor verlinkte Seite gehört einer anderen Organisation. Das Tool hat seine Vor- und Nachteile, aber die folgende Lösung erzielt immer noch das vom OP angestrebte Ergebnis.

pipenv ist ein Tool zur Abhängigkeitsverwaltung pip, das unter anderem Folgendes enthält:

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

$ pipenv install <package>

Dadurch wird eine Pip-Datei erstellt, falls keine vorhanden ist. Wenn eines vorhanden ist, wird es automatisch mit dem neuen Paket bearbeitet, das Sie bereitgestellt haben.

A Pipfileist ein direktes Äquivalent von package.json, während Pipfile.lockentspricht package-lock.json.

dskrvk
quelle
1

Sie können es manuell in einem Makefile (oder einer Textdatei speichern und dann in Ihr Makefile importieren):


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

und dann einfach rennen make install

Evan Lévesque
quelle
Ich stimme diesem Ansatz voll und ganz zu.
eleijonmarck
1

Ich verwende diese kleine Befehlszeile, um ein Paket zu installieren und seine Version zu speichern in requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt

Anthony Pierotti
quelle
0

Wie wäre es damit, eine Shell-Funktion zu erstellen, um dies zu tun? Fügen Sie den folgenden Code zu Ihrem ~/.profileoder hinzu~/.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
}

Führen Sie dann aus source ~/.profileoder source ~/.bashrcimportieren Sie es in Ihr aktuelles Terminal

Wenn Sie ein Paket installieren und speichern möchten, führen Sie es einfach aus pips requests. Nach der Installation des Pakets wird seine Version requirements.txtin Ihrem aktuellen Verzeichnis gespeichert.

Anyany Pan
quelle