Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 510
danday74 Avatar asked Feb 23 '18 04:02

danday74


3 Answers

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.

like image 110
hashedram Avatar answered Nov 07 '22 12:11

hashedram


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/1.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):

  • https://pip.pypa.io/en/latest/user_guide/#requirements-files
  • https://pip.pypa.io/en/latest/cli/pip_install/#requirements-file-format
  • https://pip.pypa.io/en/latest/cli/pip_freeze/#pip-freeze

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/install/

virtualenv-mapping-caveat

https://pipenv.pypa.io/en/latest/install/#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 comparing to npm

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

(make sure to check the guide above to get familiar with the basics)

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 insall 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 environmnent within the project! Which is created in a directory named .venv (equiv 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 dev dependency

pipenv install watchdog -d

or

pipenv install watchdog -dev

just like with npm!

pipenv all commands (pipenv -h)

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

Command help

pipenv install -h

importing from requirements.txt

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

environment management with pipenv

https://pipenv.pypa.io/en/latest/basics/#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!

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.

To mention too the pipenv cli rendering is well done:

enter image description here

Make sure to read the basics guide!

And you can see how rich is pipenv!

like image 12
Mohamed Allal Avatar answered Nov 07 '22 10:11

Mohamed Allal


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
like image 9
Haleemur Ali Avatar answered Nov 07 '22 10:11

Haleemur Ali