Jaki jest odpowiednik pip pakietu instalacyjnego npm - save-dev`?

202

W nodejs mogę zrobić, npm install package --save-devaby zapisać zainstalowany pakiet w pakiecie.

Jak mogę osiągnąć to samo w menedżerze pakietów Pythona pip? Chciałbym zapisać nazwę pakietu i jego wersję, powiedzmy, requirements.pipzaraz po zainstalowaniu pakietu za pomocą czegoś podobnego pip install package --save-dev requirements.pip.

hllau
źródło
4
pip freeze > requirements.pip
falsetru
5
To nie to samo. npm install package --save-devłączy jednocześnie instalację i dodatek do pliku wymagań node_npm. To jest bardziej przydatne. Z pip freezemuszę wykonać dwa polecenia, aby zrobić to samo: 1) pip install package2)pip freeze > requirements.pip
hllau
1
Pip ma problem z --saveopcją.
rutsky
Jeśli używasz setup.py do wymagań, stworzyłem mały moduł, aby zamrozić wersje twoich pakietów do setup.py.
AdamGold

Odpowiedzi:

166

Nie ma odpowiednika z pip.

Najlepszym sposobem jest pip install package && pip freeze > requirements.txt

Możesz zobaczyć wszystkie dostępne opcje na ich stronie dokumentacji .

Jeśli naprawdę Ci to przeszkadza, napisanie niestandardowego skryptu bash ( pips), który bierze -sargument i automatycznie zawiesza się w twoim requirements.txtpliku , nie byłoby zbyt trudne .

Edytuj 1

Od czasu napisania tego nie było żadnej zmiany w zapewnieniu --save-devopcji automatycznej podobnej do NPM, jednak Kenneth Reitz (autor requestsi wiele innych) opublikował więcej informacji na temat lepszego przepływu pracy pip, aby lepiej obsługiwać pipaktualizacje.

Edytuj 2

W powiązaniu z powyższym artykułem „lepszy przepływ pracy pip” zaleca się teraz, aby używać go pipenvdo zarządzania wymaganiami i środowiskami wirtualnymi. Korzystając z tego ostatnio, chciałbym podsumować, jak proste jest przejście:

Zainstaluj pipenv(na komputerze Mac)

brew install pipenv

pipenvtworzy własne środowiska wirtualne i zarządza nimi, więc w projekcie z istniejącym requirements.txtinstalowanie wszystkich wymagań (używam Python3.7, ale jeśli nie, możesz usunąć --three) jest tak proste, jak:

pipenv --three install

Aktywacja virtualenv do uruchamiania poleceń jest również łatwa

pipenv shell

Wymagania instalacyjne automatycznie zaktualizują PipfileiPipfile.lock

pipenv install <package>

Możliwe jest również aktualizowanie nieaktualnych pakietów

pipenv update

Gorąco polecam sprawdzenie, zwłaszcza jeśli pochodzi z npmtła, ponieważ ma podobny wygląd package.jsonipackage-lock.json

Ewan
źródło
22
Zauważ, że pozwoli to również zaoszczędzić zależności zależności, które z czasem mogą już nie być potrzebne, ponieważ zależność porzuciła korzystanie z niej.
Patrick Bassut,
Wydaje się, że nie odnosi się to do --save-dev pierwotnego pytania, które pozwala mieć różne zależności między lokalnym rozwojem a produkcją. Jak możesz to osiągnąć za pomocą pipenv?
jeznag
1
@jeznag pipenvpozwala określić dev-packagesw Pipfilei / lub użyć --dev(lub -d) z wiersza poleceń. np.pipenv install --dev nose2
Ewan
40

Ta prosta linia jest punktem wyjścia. Możesz łatwo zbudować polecenie bash, aby ponownie użyć PAKIETU w linii.

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

Dzięki @devsnd za prosty przykład funkcji bash:

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

Aby go użyć, po prostu uruchom:

pip-install-save some-package
Karim N Gorjux
źródło
Moje pięć centówP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian
4

Stworzyłem pakiet Pythona, który otacza rzeczywistą pipnazwę pipm . Wszystkie pippolecenia będą działać bez zmian, a ponadto zostaną odzwierciedlone w pliku wymagań. W przeciwieństwie do pip-save(podobne narzędzie, którego znalazłem i którego nie byłem w stanie użyć) może obsługiwać wiele plików i środowisk (test, programowanie, produkcja itp.). Ma także polecenie uaktualnienia wszystkich / dowolnych zależności.

instalacja

pipm install pkg-name

instalacja jako zależność programistyczna

pipm install pkg-name --dev

instalacja jako zależność testowa

pipm install pkg-name --test

usuwanie

pipm uninstall pkg-name

zaktualizuj wszystkie swoje zależności

pipm update

zainstaluj wszystkie zależności z pliku wymagań

pipm install

w tym zależności rozwojowe

pipm install --dev

Noortheen Raja
źródło
3

Aktualizacja: najwyraźniej pipenv nie jest oficjalnie zatwierdzony przez opiekunów Pythona , a poprzednio połączona strona jest własnością innej organizacji. Narzędzie ma swoje zalety i wady, ale poniższe rozwiązanie nadal osiąga wynik, którego szuka PO.

pipenv to narzędzie do zarządzania zależnościami, które zawiera pipi, między innymi, zapewnia to, o co pytasz:

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

$ pipenv install <package>

Spowoduje to utworzenie pliku Pip, jeśli nie istnieje. Jeśli taki istnieje, zostanie automatycznie edytowany przy użyciu nowego pakietu, który podałeś.

A Pipfilejest bezpośrednim odpowiednikiem package.json, podczas gdy Pipfile.lockodpowiada package-lock.json.

dskrvk
źródło
1

możesz ręcznie zapisać go w pliku Makefile (lub pliku tekstowym, a następnie zaimportować do pliku 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

a potem po prostu biegnij make install

Evan Lévesque
źródło
Całkowicie zgadzam się z tym podejściem.
eleijonmarck
1

Korzystam z tego małego wiersza polecenia, aby zainstalować pakiet i zapisać jego wersję w requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt

Anthony Pierotti
źródło
0

Co powiesz na wykonanie funkcji powłoki, aby to zrobić? Dodaj poniższy kod do swojego ~/.profilelub~/.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
}

następnie uruchom source ~/.profilelub, source ~/.bashrcaby zaimportować go do bieżącego terminala

jeśli chcesz zainstalować && zapisać pakiet, po prostu uruchom, na przykład pips requests. po zainstalowaniu pakietu jego wersja zostanie zapisana requirements.txtw bieżącym katalogu.

Anyany Pan
źródło