Main features of pipenv

  • Uses pipfile instead of the old requirements.txt
  • Supports dev packages by default
  • Automatically generates a lockfile, providing deterministic builds
  • Automatically creates and manages a virtualenv for your project
  • Only records top level dependencies in the Pipfile
  • Many other goodies

How does the automatic virtualenv work?

When installing the first package into a project, pipenv will create a virtualenv in your ~/.virtualenv folder, and tell you the (autogenerated) path. You don't ever need to manually enter the virtualenv, because pipenv providers two commands:

  • pipenv run myscript.py for running something inside the virtualenv
  • pipenv shell for opening a shell with the virtualenv activated

Other goodies

Using environment variables for per-environment settings is very common, so common that pipenv providers automatic loading for them. If you have a file called .env in your project root, pipenv run, and pipenv shell will automatically source it.

You can use pipenv graph for seeing your dependency graph, it will look something like this:

feedparser==5.2.1
Flask==0.12.2
  - click [required: >=2.0, installed: 6.7]
  - itsdangerous [required: >=0.21, installed: 0.24]
  - Jinja2 [required: >=2.4, installed: 2.10]
    - MarkupSafe [required: >=0.23, installed: 1.0]
  - Werkzeug [required: >=0.7, installed: 0.14.1]

You can also use pipenv check for checking for packages with known security issues. You can use pipenv install --dev packageX for installing dev packages. These will not be installed with a normal pipenv install invocation.

The output of pipenv install packageX is just so much nicer:

$ pipenv install feedparser
Creating a virtualenv for this project…
⠋Using base prefix '/usr'
New python executable in /home/myuser/.virtualenvs/myrss-cuHRAU_K/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /home/myuser/.virtualenvs/myrss-cuHRAU_K
Creating a Pipfile for this project…
Collecting feedparser
  Downloading feedparser-5.2.1.zip (1.2MB)
Building wheels for collected packages: feedparser
  Running setup.py bdist_wheel for feedparser: started
  Running setup.py bdist_wheel for feedparser: finished with status 'done'
  Stored in directory: /home/myuser/.cache/pip/wheels/15/ce/10/b500f745822ea6db6ea8ed225c06b15c000d71016b89ef9037
Successfully built feedparser
Installing collected packages: feedparser
Successfully installed feedparser-5.2.1

Adding feedparser to Pipfile's [packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (5b437e)!

It also supports importing your old requirements.txt file, so there is really no reason not to start using it right away.