Что эквивалентно pip `npm install package --save-dev`?


203

В nodejs я могу npm install package --save-devсохранить установленный пакет в пакет.

Как мне добиться того же в менеджере пакетов Python pip? Я хотел бы сохранить имя пакета и его версию, скажем, requirements.pipсразу после установки пакета, используя что-то вроде pip install package --save-dev requirements.pip.


4
pip freeze > requirements.pip
Falsetru

5
Это не то же самое. npm install package --save-devсовмещает установку и добавление в файл требований node_npm одновременно. Это более удобно. С помощью pip freezeя должен сделать две команды, чтобы сделать то же самое: 1) pip install package2)pip freeze > requirements.pip
hllau

1
Пип имеет вопрос о --saveварианте.
Руцкий

Если вы используете setup.py для требований, я создал небольшой модуль для замораживания версий вашего пакета в setup.py.
AdamGold

Ответы:


167

Нет эквивалента с pip.

Лучший способ это pip install package && pip freeze > requirements.txt

Вы можете увидеть все доступные опции на их странице документации .

Если это действительно беспокоит вас, не составит труда написать собственный скрипт bash ( pips), который принимает -sаргумент и requirements.txtавтоматически замораживает ваш файл.

Редактировать 1

С момента написания этой статьи не было никаких изменений в предоставлении автоматической --save-devопции, аналогичной NPM, однако Кеннет Рейтц (автор requestsи многие другие) выпустил дополнительную информацию о лучшем рабочем процессе пипса для лучшей обработки pipобновлений.

Редактировать 2

В соответствии с приведенной выше статьей «лучший рабочий процесс в пипсах» рекомендуется использовать ее pipenvдля управления требованиями и виртуальными средами. Пользуясь этим много раз в последнее время, я хотел бы резюмировать, насколько простой переход:

Установить pipenv(на Mac)

brew install pipenv

pipenvсоздает и управляет своими собственными виртуальными средами, поэтому в проекте с существующими requirements.txtустановкой всех требований (я использую Python3.7, но вы можете удалить, --threeесли нет) так же просто, как:

pipenv --three install

Активировать virtualenv для запуска команд также легко

pipenv shell

Требования к установке автоматически обновят PipfileиPipfile.lock

pipenv install <package>

Также возможно обновление устаревших пакетов

pipenv update

Я настоятельно рекомендую проверить его , особенно если исходит от npmфона , как это имеет подобное чувство к package.jsonиpackage-lock.json


23
Обратите внимание, что это также сохранит зависимости зависимостей, которые со временем могут больше не понадобиться, потому что зависимость от них отказалась.
Патрик Бассут

1
Похоже, это не относится к аспекту --save-dev исходного вопроса, который позволяет вам иметь различные зависимости для локальной разработки по сравнению с производством. Как вы можете достичь этого с pipenv?
jeznag

1
@jeznag pipenvпозволяет вам указать dev-packagesв вашем Pipfileи / или использовать --dev(или -d) из командной строки. напримерpipenv install --dev nose2
Юань

40

Эта простая линия является отправной точкой. Вы можете легко собрать команду bash, чтобы повторно использовать ПАКЕТ в строке.

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

Спасибо @devsnd за простой пример функции bash:

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

Чтобы использовать это, просто запустите:

pip-install-save some-package

Мои пять центовP=Flask pip install $P && pip freeze | grep $P >> requirements.txt
GBrian

4

Я создал питон пакет , который оборачивается вокруг реального pipназывается pipm . Все pipкоманды будут работать как есть, плюс они будут отражены в файле требований. В отличие от pip-save(похожего инструмента, который я нашел и не смог использовать), он может обрабатывать множество файлов и сред (test, dev, production и т. Д.). Он также имеет команду для обновления всех / любых ваших зависимостей.

монтаж

pipm install pkg-name

установка как зависимость развития

pipm install pkg-name --dev

установка как тестирование зависимости

pipm install pkg-name --test

удаление

pipm uninstall pkg-name

обновить все ваши зависимости

pipm update

установить все ваши зависимости из файла требований

pipm install

в том числе зависимости развития

pipm install --dev


3

Обновление: очевидно, что pipenv официально не одобрен сопровождающими Python , а ранее связанная страница принадлежит другой организации. У инструмента есть свои плюсы и минусы, но приведенное ниже решение все же дает результат, к которому стремится OP.

pipenv - это инструмент управления зависимостями, который упаковывает pipи, помимо прочего, предоставляет то, что вы просите:

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

$ pipenv install <package>

Это создаст Pip-файл, если он не существует. Если он существует, он будет автоматически отредактирован с новым пакетом, который вы предоставили.

А Pipfileявляется прямым эквивалентом package.json, а Pipfile.lockсоответствует package-lock.json.


2

Я быстро взломал, pipчтобы добавить --saveопцию для установки / удаления команд.

Пожалуйста, посмотрите на мой блог для получения дополнительной информации об этом взломе: http://blog.abhiomkar.in/2015/11/12/pip-save-npm-like-behaviour-to-pip/

Установка (GitHub): https://github.com/abhiomkar/pip-save

Надеюсь это поможет.


1

Вы можете вручную сохранить его в Makefile (или в текстовом файле, а затем импортировать в ваш 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

а потом просто беги make install


Я полностью согласен с этим подходом.
eleijonmarck

1

Я использую эту маленькую командную строку, чтобы установить пакет и сохранить его версию в requirements.txt: pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt


0

Как насчет сделать функцию оболочки, чтобы сделать это? Добавьте код ниже к вашему ~/.profileили~/.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
}

затем запустите source ~/.profileили source ~/.bashrcимпортируйте его в свой текущий терминал

если вы хотите установить && сохранить пакет, просто запустите, например pips requests. после установки пакета его версия будет сохранена requirements.txtв вашем текущем каталоге.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.