Pipenv, the new Python packaging tool

published on: | by cindy In category: Python

Clearly,I have been living under a rock but not anymore! I shared an article using pip and M. Floering suggested I check pipenv. You guessed right , yes I did and I am loving it! Pipenv is the official recommended python packaging tool acccording to pipenv.org. It is a great tool for managing your project's dependencies as well as install and uninstall packages.

Seems like pip and virtualenv did just well, but why pipenv?

  1. Think of pipenv as a powerful combination of pip and virtualenv.
  2. Goodbye to manually creating and managing your virtual environments pipenvdoes it for you!.
  3. Great at managing project's dependencies.Instead of pip's requirements.txt, pipenv creates two files the pipfile for the packages you installed directly and pipfile.lock for the dependencies and the specific version of the packages based on your pipfile.

pipenv workflow

  1. Create virtualenv if doesn't exist already.
  2. Create pipfile to manage the packages installed by you
  3. Finally, creates pipfile.lock to manage dependencies for the packages in pipfile

Let's get started!

We use pip to install pipenv,so ensure you have both python and pip installed. To check if pip is installed run:

pip --version

.. and python:

python --version

Installing pipenv

pip install --user pipenv

Note

I have used the user installation otherwise just run pip install pipenv .

Using pipenv

Now that we have successfully installed pipenv, let's use it to create the project directory and name it(I will call mine laughing-blog) and then change directory into the project's folder. Let's Initiate pipenv by using the install command.

mkdir laughing-blog //projectname
cd laughing-blog
pipenv --three install

Note

Specify your python version by using pipenv --three for python 3 and pipenv --two for python 2. To use an arbitrary python version do: pipenv --python 3.6.4 or just pipenv install to use the default python version.

The above code creates a new virtual environment for your project if it doesn’t exist already and the two magic files, Pipfile and Pipfile.lock in your project directory.

Below is a breakdown of the pipenv install output.

virtualenv

Creating a virtualenv for this project…
Using /usr/bin/python3 (3.5.2) to create virtualenv
Virtualenv location:/home/cindy/.local/share/virtualenvs/laughing-blog-FpALE3CM

pipfile

Creating a Pipfile for this project…

Finally, pipfile.lock

Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (711973)!
Installing dependencies from Pipfile.lock (711973)…
🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉
0/0 — 00:00:00

Activating Virtualenv

To activate virtualenv,simply run:

$ pipenv shell

To exit virtulalenv,run:

$ exit

Managing Packages

To install a package simply run:

$ pipenv  install <packagename>

... and to remove the package in the pipfile run:

$ pipenv  uninstall <packagename>

understanding pipfile and pipfile.lock

Pipfile

Pipfile manages the packages that you install,think of it as an upgrade of requirements.txt.

What makes pipfile superior to requirements.txt Lets look at a sample of requirements.txt file

Note

simply run pip freeze > requirements.txt to generate the above file

certifi==2018.4.16
chardet==3.0.4
defusedxml==0.5.0
Django==2.0.4
django-allauth==0.35.0
idna==2.6
oauthlib==2.0.7
python3-openid==3.1.0

You will notice that requirements.txt list all the package we installed , version and the dependencies as well. pipfile holds the packages we installed and spare the rest to pipfile.lock

pipfile.lock

This is the file that contains the dependencies based on the packages present in Pipfile, the specific version of the packages to be used, avoiding the risks of automatically upgrading packages that depend upon each other and breaking your project dependency tree. If pipfile.lock wasn't created for some reason, you can lock the currently installed packages by running:

$ pipenv lock

pipfile sample bash [packages] django = "*" django-allauth = "*" [requires] python_version = "3.5"

pipfile.lock sample

  "django-allauth": {
        "hashes": [
            "sha256:7b31526cccd1c46f9f09acf0703068e8a9669337d29eb065f7e8143c2d897339"
        ],
        "index": "pypi",
        "version": "==0.35.0"
    },
    "idna": {
        "hashes": [
            "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f",
           "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4"
        ],
        "version": "==2.6"
    },
    "oauthlib": {
        "hashes": [
            "sha256:09d438bcac8f004ae348e721e9d8a7792a9e23cd574634e973173344046287f5",
            "sha256:909665297635fa11fe9914c146d875f2ed41c8c2d78e21a529dd71c0ba756508"
        ],
        "version": "==2.0.7"
    },
    "python3-openid": {
        "hashes": [
            "sha256:0086da6b6ef3161cfe50fb1ee5cceaf2cda1700019fda03c2c5c440ca6abe4fa",
            "sha256:628d365d687e12da12d02c6691170f4451db28d6d68d050007e4a40065868502"
        ],
        "version": "==3.1.0"
    },

Conclusion

Now,you know the definition,advantages and how pipenv functions.And the difference between the two magic files pipfile and pipfile.lock