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