Python Project Dependencies: Difference between revisions

From Littledamien Wiki
Jump to navigation Jump to search
No edit summary
Line 76: Line 76:
$ python setup.py install
$ python setup.py install
</syntaxhighlight>
</syntaxhighlight>
== Alternate workflow ==
Save the top-level dependencies in one file, then save the specific dependencies in `requirements.txt`.
See [https://kenreitz.org/essays/a-better-pip-workflow A Better Pip Workflow] for details.
But basically, on the development server create a file named `requirements-to-freeze.txt`. In that file list the top-level packages used by the project.
<pre>
$ pip install -r requirements-to-freeze.txt --upgrade
$ pip freeze > requirements.txt
</pre>


== Notes ==
== Notes ==

Revision as of 15:50, 25 August 2020

requirements.txt

First, for every project create and load a virtual environment specific to the project before installing dependencies.

Project dependencies are stored in a file named requirements.txt in the top level of the project, e.g.: [1]

requirements.txt defines concrete dependencies for non-redistributable applications. It defines the dependencies between packages and the source for those packages, especially if they don't come from PyPi.

An example requirements.txt:

django==1.6
bpython==0.12
django-braces==0.2.1
django-model-utils==1.1.0
logutils==0.3.3
South==0.7.6
requests==1.2.0
stripe==1.9.1
dj-database-url==0.2.1
django-oauth2-provider==0.2.4
djangorestframework==2.3.1

Saving dependencies

Anytime a package is installed with pip, it must be added to requirements.txt. Or better yet, add the package to requirements.txt and use the file to install the new package and verify the project's environment.

A quick and reliable way to track all the packages currently installed with pip is with

$ pip freeze > requirements.txt

This saves the packages along with their current version. This means that installing from requirements.txt in the future might mean installing older versions of packages. This article has a recommendation for tracking both the top-level packages and all their dependencies. [2]

Installing dependencies

Dependencies in requirements.txt can be installed with:

$ pip install -r requirements.txt

setup.py

In addition to requirements.txt, setup.py is another file used to check for dependencies when installing a package. [3]

setup.py defines abstract dependencies for redistributable packages. The specific source for those dependencies should be defined elsewhere, e.g. requirements.txt.

Given a directiory containing a setup.py file, a requirements.txt file can be written that will install all dependencies found in setup.py from PyPi:

--index-url https://pypi.python.org/simple

-e .

If any dependencies should come from another source, requirements.txt can be modified similar to this:

--index-url https://pypi.python.org/simple

-e https://github.com/foo/bar.git#egg=bar
-e .

pip will first install the bar library from GitHub, then move on to install all the dependencies found in setup.py. Since the bar library has already been installed at this point, it will be skipped over when installing libraries from PyPi.

Installing packages defined in setup.py

Command to install the project dependencies defined in setup.py: [4] [5]

$ python setup.py install

Alternate workflow

Save the top-level dependencies in one file, then save the specific dependencies in requirements.txt.

See A Better Pip Workflow for details.

But basically, on the development server create a file named requirements-to-freeze.txt. In that file list the top-level packages used by the project.

$ pip install -r requirements-to-freeze.txt --upgrade
$ pip freeze > requirements.txt

Notes

See also

References

  1. Application Dependencies, Full Python Stack
  2. A Better Pip Workflow - Kenneth Reitz
  3. setup.py vs requirements.txt, Donald Stufft
  4. What is setup.py - Stackoverflow
  5. Installing Python Modules - Python Software Foundation