The “Python Development Workflow for Humans”, or “Pipenv”, was created by Kenneth Reitz in 2017. It is now recognized as the official Python-recommended resource for managing package dependencies. But there is still widespread confusion about what problems it is supposed to solve and its usefulness in solving them. The standard workflow uses pip and a “requirements .txt file”, but it is necessary to find out if Pipenv is more useful. This, therefore, is A Guide To Pipenv in brief. It can be a powerful tool that can improve development workflow as illustrated across numerous projects including the popular casual dating site Free Fuckbook App along with other high traffic web applications.
These are the results created whenever one class depends on another class, for example, if class A depends on a class B to function, then class A is called a ‘dependant’, while class B is known as a ‘dependency’. In order to use or re-use class A, class B must also be used or re-used. Whenever Object Oriented Design (OOD) of API’s and Applications are done, dependencies and their removal become important. Any discussion on OOP (Object Oriented Programming) is incomplete without mentioning dependencies loose couplings. Two classes that use each-other are said to be ‘coupled’. The couplings between classes can be loose or tight or a bit of both. In reality, the degree of tightness is continuous, and is often characterized as ‘strong’ or ‘weak’. But dependencies represent weaknesses in OOP. Dependencies decreases re-use. Re-use always impact Development Speed positively, as well as, Code Quality and Code Readability. There are three general types of dependencies. These are Class, Interface and Method/Field dependencies. Dependencies also have important characteristics. They can be Run-time, Compile-time, Hidden or Visible, Local and Contextual, Direct or Indirect. But whatever they are, they need to be eliminated, or at least managed.
Pipenv is a Tool that aims to bring the best of all packaging worlds to Python. In other words, npm, bundler, cargo, composer, yarn etc. are all included in a single Tool. Its specialty is to automatically create and manage a virtualenv for the developer’s projects, as well as adding or removing packages from the Pipfile, while installing or uninstalling packages. At the same time, Pipenv generates the Pipfile, which is important in order to create deterministic builds. The main target is to create a working environment with ease for developers and users alike. Pipenv not only addresses some common issues, but also freezes the development process to a simplified single command line tool. One of the major benefits of using Pipenv is handling of a typical situation of third-party packages. For example, if we were using ‘Flask’, a third-party pack, we would need to specify that requirement so that other developers and automated systems can also run the application. A new version of Flask may have got released, but maybe it is backward compatible with the version used during development. Now if that application is deployed to production, and a Pip install ‘-r requirements.txt’ is done, Pip having got Flask, the latest compatible-not-backward version, the application will break in production.
Pipenv allows for deterministic builds for any Python project without the additional responsibility of updating versions of sub-dependencies. Pipenv allows the development of projects in Python with different dependencies. If, for example, different versions of Django are used on two projects A and B, every-time it is needed to switch between Project A and Project B, you have to uninstall all the packages in Project A based, based on one version of Django, and install all the packages based on the other version of Django compatible to the use of Project B. This is not only time consuming, but actually painful. A standard solution for regular switching between projects is to use a virtual environment that has its own third-party package storage in Python. Pipenv has a virtual environment already built in and so eliminates the effort for creating virtual environment each time this is required. This feature of Pipenv is called ‘Venv’ (Virtual Environment).
Pipenv is a growing next gen Python Dependency Management Tool. Some of the salient features of Pipenv are: Pipenv abridges the route of organizing dependencies and creating a virtual environment.
By specific versions to locking dependencies, Pipenv guarantees that builds of the package are reproducible.
Pipenv works by specifying development dependencies and separate core in different parts of the same file to replace separate dependencies files.
Pipenv can be used to both manage and publish packages.
Pipenv is supported by Python directly and regularly release updates and versions. The last version was released on November 26th 2018.
When first released, upgrading any single package of Pipenv, would upgrade all dependencies. This behavior, however, is now being corrected.
The Pipenv ‘install’ command is dual purpose. Only the package specified will be installed, leaving the others untouched. If no package is specified, all (non-dev) dependencies are also installed.
Pipenv is supported officially by the Python Packaging Authority (PPA) and also by the Hiroku Python Builtpack (HPB), and this is important to developers with Dokku or Hiroku- based deployment strategies.
Pipenv supports being able to export a ‘requirement.txt’ file.
However, Pipenv seems to have some flaws from birth which, if not corrected immediately, can lead to confusion. Pipenv commands and options are often confusing and unclear, and many options are not available. Many User’s patience are sorely tested by regression issues of Pipenv. Tested against cross platform and multi-environment is not only complicated and difficult, it is very time consuming.
Pipenv has to solve the package installation problem to the Pip Library for plus two libraries for creating and to manage virtual environments, also all the commands in association with the libraries. Pipenv abandons the ‘requirements.txt’ norm for a new document known as Pipfile to achieve the dependency management. When installing Pipenv Library, a Pipfile for the project is involuntarily updated with installation details, including information version and possibly the file path and other information like Git repository location. An additional Pipfile.lock keeps track of the app’s interdependencies and also verifies that the right dependency versions are used in production.