Reputation: 10549
In nodejs, I can do npm install package --save-dev
to save the installed package into the package.
How do I achieve the same thing in Python package manager pip
? I would like to save the package name and its version into, say, requirements.pip
just after installing the package using something like pip install package --save-dev requirements.pip
.
Upvotes: 346
Views: 158539
Reputation: 7457
This is a simple bash script you can use:
#install-packages.sh
#!/bin/bash
packages="package-1 package-2 package-3"
for i in $packages; do
pip install $i && pip freeze | grep $i >> requirements.txt
done
You always only use this file as the source of truth and also you keep updating your packages (if this is the desired behaviour)
Upvotes: 0
Reputation: 861
I've created python package that wraps around the actual pip
called pipm
. All pip
commands will work as it is, plus they will be reflected in the requirements file. Unlike pip-save
(inactive for sometime), a similar tool I found and wasn't able to use, it can handle many files and environments(test, dev, production, etc. ). It also has a command to upgrade all/any of your dependencies.
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
Upvotes: 10
Reputation: 15058
There isn't an equivalent with pip
.
Best way is to pip install package && pip freeze > requirements.txt
You can see all the available options on their documentation page.
If it really bothers you, it wouldn't be too difficult to write a custom bash script (pips
) that takes a -s
argument and freezes to your requirements.txt
file automatically.
Edit 1
Since writing this there has been no change in providing an auto --save-dev
option similar to NPM however Kenneth Reitz (author of requests
and many more) has released some more info about a better pip workflow to better handle pip
updates.
Edit 2
Linked from the "better pip workflow" article above it is now recommended to use pipenv
to manage requirements and virtual environments. Having used this a lot recently I would like to summarise how simple the transition is:
Install pipenv
(on Mac)
brew install pipenv
pipenv
creates and manages it's own virtual environments so in a project with an existing requirements.txt
, installing all requirements (I use Python3.7 but you can remove the --three
if you do not) is as simple as:
pipenv --three install
Activating the virtualenv to run commands is also easy
pipenv shell
Installing requirements will automatically update the Pipfile
and Pipfile.lock
pipenv install <package>
It's also possible to update out-of-date packages
pipenv update
I highly recommend checking it out especially if coming from a npm
background as it has a similar feel to package.json
and package-lock.json
Upvotes: 256
Reputation: 1378
Update: apparently, pipenv is not officially endorsed by Python maintainers, and the previously-linked page is owned by a different organization. The tool has its pros and cons, but the below solution still achieves the result that the OP is seeking.
pipenv is a dependency management tool that wraps pip
and, among other things, provides what you're asking:
https://pipenv.kennethreitz.org/en/latest/#example-pipenv-workflow
$ pipenv install <package>
This will create a Pipfile if one doesn’t exist. If one does exist, it will automatically be edited with the new package your provided.
A Pipfile
is a direct equivalent of package.json
, while Pipfile.lock
corresponds to package-lock.json
.
Upvotes: 6
Reputation: 3033
This simple line is a starting point. You can easily built a bash command to reuse the PACKAGE in the line.
pip install PACKAGE && pip freeze | grep PACKAGE >> requirements.txt
Thanks to @devsnd for the simple bash function example:
function pip-install-save {
pip install $1 && pip freeze | grep $1 >> requirements.txt
}
To use it, just run:
pip-install-save some-package
Upvotes: 95
Reputation: 31
I am using this small command line to install a package and save its version in requirements.txt
:
pkg=package && pip install $pkg && echo $(pip freeze | grep -i $pkg) >> requirements.txt
Upvotes: 3
Reputation: 777
How about make a shell function to do this ?
Add below code to your ~/.profile
or ~/.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
}
then run source ~/.profile
or source ~/.bashrc
to import it to your current terminal
when you want to install && save a package, just run, for example pips requests
.
after package was installed, its version will be save into requirements.txt
in your current directory.
Upvotes: 3
Reputation: 3203
you can manually save it in a Makefile (or a text file and then imported in your 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
and then just run make install
Upvotes: 3
Reputation: 5038
I made a quick hack on pip
to add --save
option to install/uninstall commands.
Please have a look at my blog for more information about this hack: http://blog.abhiomkar.in/2015/11/12/pip-save-npm-like-behaviour-to-pip/
Installation (GitHub): https://github.com/abhiomkar/pip-save
Hope this helps.
Upvotes: 2