Does python pip have the equivalent of node's package.json?
Asked Answered
B

5

44

In NodeJS's npm you can create a package.json file to track your project dependencies. When you want to install them you just run npm install and it looks at your package file and installs them all with that single command.

When distributing my code, does python have an equivalent concept or do I need to tell people in my README to install each dependency like so:

pip install package1
pip install package2

Before they can use my code?

Burgonet answered 23/2, 2018 at 4:27 Comment(0)
L
45

Once all necessary packages are added

pip freeze > requirements.txt

creates a requirement file.

pip install -r requirements.txt

installs those packages again, say during production.

Lite answered 23/2, 2018 at 4:31 Comment(3)
accepting this as correctly states how to create the requirements file automaticallyBurgonet
This will list all installed packages, not just those used by the project. So if not using inside a virtual environment take care. I don't think there's any way around it though.Exemplar
package.json normally includes fields like name and version of the package, is this information also stored in requirements.txt or somewhere else, or simply omitted in Python?Georama
T
35

The best way may be pipenv. I personally use it.

However, in this guide, I'll explain how to do it with just Python and pip. And without pipenv. That's the first part. And it will give us a good understanding about how pipenv works. There is a second part that treat pipenv. Check the section pipenv (The more close to npm).

Python and pip

To get it all well with python. Here the main elements:

  • virtual environment
  • requirements file (listing of packages)
  • pip freeze command
  • How to install packages from a requirements file

Virtual environment and why

Note that for this the package venv is to be used. It's the official thing. And shiped with python 3 installation starting from 3.3+ .

To know well the what is it and the why check this out https://docs.python.org/3/tutorial/venv.html

In short, a virtual environment will help us manage an isolated version of python interpreter. And so too installed packages. In this way. Different project will not have to depends on the same packages installation and have to conflict. Read the link above explain and show it well.

... This means it may not be possible for one Python installation to meet the requirements of every application. If application A needs version 1.0 of a particular module but application B needs version 2.0, then the requirements are in conflict and installing either version 1.0 or 2.0 will leave one application unable to run.

You may like to check the explanation on flask framework doc.

https://flask.palletsprojects.com/en/2.1.x/installation/#virtual-environments

Why we care about this and should use it. To isolate the projects. (each have it's environment). And then freeze command will work per project base. Check the last section.

Usage

Here a good guide on how to setup and work:

https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/

Check the installation section first.

Then

To create a virtual environment you go to your project directory and run:

On macOS and Linux:

> python3 -m venv env

On Windows:

> py -m venv env

Note You should exclude your virtual environment directory from your version control system using .gitignore or similar.

To start using the environment in the console, you have to activate it

https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/#activating-a-virtual-environment

On macOS and Linux:

> source env/bin/activate

On Windows:

> .\env\Scripts\activate

See the part on how you check that you are in the environment (using which (linux, unix) or where (windows).

To deactivate you use

> deactivate

Requirement files

https://pip.pypa.io/en/latest/user_guide/#requirements-files

“Requirements files” are files containing a list of dependencies to be installed using pip install like so

(How to Install requirements files)

pip install -r requirements.txt

Requirements files are used to hold the result from pip freeze for the purpose of achieving repeatable installations. In this case, your requirement file contains a pinned version of everything that was installed when pip freeze was run.

python -m pip freeze > requirements.txt
python -m pip install -r requirements.txt

Some of the syntax:

pkg1
pkg2==2.1.0
pkg3>=1.0,<=2.0

== for precise.

requests==2.18.4
google-auth==1.1.0

Force pip to accept earlier versions

ProjectA
ProjectB<1.3

Using git with a tag (fixing a bug yourself and not waiting)

git+https://myvcs.com/some_dependency@sometag#egg=SomeDependency

Again check the link https://pip.pypa.io/en/latest/user_guide/#requirements-files I picked all the examples from them. You should see the explanations. And details.

For the format details check: https://pip.pypa.io/en/latest/cli/pip_install/#requirements-file-format

Freeze command

Pip can export a list of all installed packages and their versions using the freeze comman. At the run of the command. The list of all installed packages in the current environment get listed.

pip freeze

Which will output something like:

cachetools==2.0.1
certifi==2017.7.27.1
chardet==3.0.4
google-auth==1.1.1
idna==2.6
pyasn1==0.3.6
pyasn1-modules==0.1.4
requests==2.18.4
rsa==3.4.2
six==1.11.0
urllib3==1.22

We can write that to a requirements file as such

pip freeze > requirements.txt

https://pip.pypa.io/en/latest/cli/pip_freeze/#pip-freeze

Installing packages Resume

By using venv (virtual environment) for each project. The projects are isolated. And then freeze command will list only the packages installed on that particular environmnent. Which make it by project bases. Freeze command make the listing of the packages at the time of it's run. With the exact versions matching. We generate a requirements file from it (requirements.txt). Which we can add to a project repo. And have the dependencies installed.

The whole can be done in this sense:

Linux/unix

python3 -m venv env
source env/bin/activate
pip3 install -r requirements.txt

Windows

py -m venv env
.\env\Scripts\activate
pip3 install -r requirements.txt

First time setup after cloning a repo.

Creating the new env.

Then activating it.

Then installing the needed packages to it.

Otherwise here a complete guide about installing packages using requiremnets files and virtual environment from the official doc: https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/

This second guide show all well too: https://docs.python.org/3/tutorial/venv.html

Links listing (already listed):

🔥 pipenv (The more close to npm) 🔥

https://pipenv.pypa.io/en/latest/

pipenv is a tool that try to be like npm for python. Is a super set of pip.

pipenv create virtual environment for us. And manage the dependencies.

A good feature too is the ability to writie packages.json like files. With scripts section too in them.

Executing pipfile scripts

run python command with alias in command line like npm

Installation

https://pipenv.pypa.io/en/latest/installation/

virtualenv-mapping-caveat

https://pipenv.pypa.io/en/latest/installation/#virtualenv-mapping-caveat

For me having the env created within the project (just like node_modules) should be even the default. Make sure to activate it. By setting the environment variable.

pipenv can seems just more convenient.

Mainly managing run scripts is too good to miss on. And a one tool that simplify it all.

Basic usage and comparison to npm

Note that the equivalent of npm package.json is the PipFile file.

An example:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
flask = "*"
simplejson = "*"
python-dotenv = "*"

[dev-packages]
watchdog = "*"

[scripts]
start = "python -m flask run"

[requires]
python_version = "3.9"

There is Pipfile.lock like package.lock

To run npm install equivalent. You run pipenv install.

To install a new package

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 you provided.

Just like with npm.

$ pipenv install "requests>=1.4"   # will install a version equal or larger than 1.4.0
$ pipenv install "requests<=2.13"  # will install a version equal or lower than 2.13.0
$ pipenv install "requests>2.19"   # will install 2.19.1 but not 2.19.0

If the PIPENV_VENV_IN_PROJECT=1 env variable is set. To make pipenv set the virtual environment within the project. Which is created in a directory named .venv (equivalent to node_modules).

Also running pipenv install without a PipFile in the directory. Neither a virtual environment. Will create the virtual environment on .venv directory (node_modules equiv). And generate a PipFile and Pipfile.lock.

enter image description here

Installing flask example:

pipenv install flask

Installing as a dev dependency

pipenv install watchdog -d

or

pipenv install watchdog -dev

just like with npm.

pipenv all commands (pipenv -h)

Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Options:
  --where                         Output project home information.
  --venv                          Output virtualenv information.
  --py                            Output Python interpreter information.
  --envs                          Output Environment Variable options.
  --rm                            Remove the virtualenv.
  --bare                          Minimal output.
  --man                           Display manpage.
  --support                       Output diagnostic information for use in
                                  GitHub issues.
  --site-packages / --no-site-packages
                                  Enable site-packages for the virtualenv.
                                  [env var: PIPENV_SITE_PACKAGES]
  --python TEXT                   Specify which version of Python virtualenv
                                  should use.
  --clear                         Clears caches (pipenv, pip).  [env var:
                                  PIPENV_CLEAR]
  -q, --quiet                     Quiet mode.
  -v, --verbose                   Verbose mode.
  --pypi-mirror TEXT              Specify a PyPI mirror.
  --version                       Show the version and exit.
  -h, --help                      Show this message and exit.


Usage Examples:
   Create a new project using Python 3.7, specifically:
   $ pipenv --python 3.7

   Remove project virtualenv (inferred from current directory):
   $ pipenv --rm

   Install all dependencies for a project (including dev):
   $ pipenv install --dev

   Create a lockfile containing pre-releases:
   $ pipenv lock --pre

   Show a graph of your installed dependencies:
   $ pipenv graph

   Check your installed dependencies for security vulnerabilities:
   $ pipenv check

   Install a local setup.py into your virtual environment/Pipfile:
   $ pipenv install -e .

   Use a lower-level pip command:
   $ pipenv run pip freeze

Commands:
  check         Checks for PyUp Safety security vulnerabilities and against
                PEP 508 markers provided in Pipfile.
  clean         Uninstalls all packages not specified in Pipfile.lock.
  graph         Displays currently-installed dependency graph information.
  install       Installs provided packages and adds them to Pipfile, or (if no
                packages are given), installs all packages from Pipfile.
  lock          Generates Pipfile.lock.
  open          View a given module in your editor.
  requirements  Generate a requirements.txt from Pipfile.lock.
  run           Spawns a command installed into the virtualenv.
  scripts       Lists scripts in current environment config.
  shell         Spawns a shell within the virtualenv.
  sync          Installs all packages specified in Pipfile.lock.
  uninstall     Uninstalls a provided package and removes it from Pipfile.
  update        Runs lock, then sync.
  upgrade       Resolves provided packages and adds them to Pipfile, or (if no
                packages are given), merges results to Pipfile.lock
  verify        Verify the hash in Pipfile.lock is up-to-date.

Command help

pipenv install -h

importing from requirements.txt

https://pipenv.pypa.io/en/latest/pipfile/#importing-from-requirements-txt

Environment management with pipenv

pipenv run

To run anything with the project virtual environment you need to use pipenv run

As like pipenv run python server.py.

Custom scripts shortcuts

scripts in npm. Or tasks.

https://pipenv.pypa.io/en/latest/advanced/#custom-script-shortcuts

[scripts]
start = "python -m flask run"

And to run

pipenv run start

Just like with npm.

If you’d like a requirements.txt output of the lockfile, run $ pipenv lock -r. This will include all hashes, however (which is great.). To get a requirements.txt without hashes, use $ pipenv run pip freeze.

Deployment with pipenv

To mention too the pipenv cli rendering is well done:

enter image description here

Make sure to read the basic guides. And the main doc link, does contains all the links.

And you can see how rich is pipenv.

Thee answered 22/5, 2021 at 14:1 Comment(7)
This should be the accepted answer because simply pip install -r requirements.txt does not compare to the possibilities of the package.json at all.Pancreatotomy
Author should reconsider how to write. Ending every sentence with ! is somewhat amusing but also quite distracting.Corell
Noted. I had that habit. And some people didn't like it. I switched to make all people happy. (For amusement: ! is like a semicolon, flexed a bit. )Thee
This answer is so long that we loose track of the important point. I found the section pipenv (The more close to npm) in this answer really helpfulClearstory
This post has way too many exclamation points to the extent it becomes a distraction. For example you say "In short!", whereas In short should have been followed by a comma.Karttikeya
@DanielViglione This post is a bit old. I had that bad habit. People pointed me about it. I stopped using exclamations. The links on this post are outdated as well. The official doc changed a bit. I'm counting to update them. So ill profit and remove the exclamation points.Thee
@DanielViglione it's done. No more !. + All obsolete links are removed and updated for the latest doc. If anything else feel free to edit directly.Thee
S
11

Once all the packages have been installed, run

pip freeze > requirements.txt

This will save the package details in the file requirements.txt.

For installation, run

pip install -r requirements.txt

to install the packages specified by requirements.txt.

Subtemperate answered 23/2, 2018 at 4:31 Comment(0)
C
10

Yes, it's called the requirements file:

https://pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiers

You can specify the package name & version number.

You can also specify a git url or a local path.

In the usual case, you would specify the package followed by the version number, e.g.

sqlalchemy=1.0.1

You can install all the packages specified in a requirements.txt file through the command

pip install -r requirements.txt
Comeon answered 23/2, 2018 at 4:30 Comment(3)
What is the -r for?Panthia
it specifies that the next argument should be interpreted as a file and not a package to install.Exemplar
Above link is broken. This works: pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiersSpar
I
2

I would like to propose pipenv here. Managing packages with Pipenv is easier as it manages the list and the versions of packages for you because I think you need to run pip freeze command each time you make changes to your packages.

It will need a Pipfile. This file will contain all of your required packages and their version just like package.json.

You can delete/update/add projects using pipenv install/uninstall/update <package>

This also generates a dependency tree for your project. Just like package-lock.json

Checkout this post on Pipfiles

Learn more about Pipenv

Induction answered 13/5, 2021 at 21:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.