Python equivalent of npm or rubygems
I've been looking around for a package manager that can be used with python. I want to list project dependencies in a file. For example ruby uses Gemfile where you can use bundle install. How can I achieve this in python?
The pip
tool is becoming the standard in equivalent of Ruby's gems. Like distribute
, pip
uses the PyPI package repository (by default) for resolving and downloading dependencies. pip
can install dependencies from a file listing project dependencies (called requirements.txt
by convention):
pip install -r requirements.txt
You can "freeze" the current packages on the Python path using pip as well:
pip freeze > requirements.txt
When used in combination with the virtualenv
package, you can reliably create project Python environments with a project's required dependencies.
Pipenv
(I know it's an old question, and it already has an answer but for anyone coming here looking for a different answer like me.)
I've found a very good equivalent for npm, It's called pipenv. It handles both virtualenv and pip requirements at the same time so it's more like npm.
Simple Use Case
pip install pipenv
then you can make a new virtualenv with third version of python, as well as making a pipfile that will be filled with your projects requirement and other stuff:
pipenv install --three
using your created virtualenv:
pipenv shell
installing a new python package:
pipenv install requests
running your .py file is like:
pipenv run python somefile.py
you can find it's doc here.
Python uses pip
for a package manager. The pip install
command has a -r <file>
option to install packages from the specified requirements file.
Install command:
pip install -r requirements.txt
Example requirements.txt
contents:
Foo >= 1.2
PickyThing <1.6,>1.9,!=1.9.6,<2.0a0,==2.4c1
SomethingWhoseVersionIDontCareAbout
See the Requirements Parsing section of the docs for a full description of the format: https://pip.pypa.io/en/stable/user_guide/#requirements-files
This is how I restrict pip
's scope to the current project. It feels like the opposite if you're coming from NodeJS's npm
or PHP's composer
where you explicitly specify global installations with -g
or --global
.
If you don't already have virtualenv
installed, then install it globally with:
pip install virtualenv
Each Python project should have its own virtualenv
installation. It's easy to set one up, just cd
to your project's root and:
python3 -m virtualenv env # creates env folder with everything you need
Activate virtualenv:
source env/bin/activate
Now, any interaction with pip
is contained within your project.
Run pip install package_name==version
for each of your dependencies. They are installed in ./env/lib/python3.x/site-packages/
When you want to save your project's dependencies to a file, run:
pip freeze > requirements.txt
You actually don't need -l
or --local
if you're in an activated project-specific virtualenv (which you should be).
Now, when you want to install your dependencies from requirements.txt
, set up your virtualenv, and run:
pip install -r requirements.txt
That's all.
Here is a comparison of pipenv
vs poetry
vs pdm
: https://dev.to/frostming/a-review-pipenv-vs-poetry-vs-pdm-39b4
The conclusion is that pdm
is the winner.
But in my experience, poetry
is easier than pdm
to integrate with IDEs.