Skip to main content

PyPI version Supported Python versions Build status Codecov Code coverage

venvs is a tool for configuring, in a single file, a set of virtualenvs, which packages to install into each, and any binaries to make globally available from within.

Installation

The usual:

$ pip install venvs

Usage

The best way to use venvs is by creating a file named ~/.local/share/virtualenvs/virtualenvs.toml. Here’s an example of what goes in it:

[virtualenv.development]
install = [
    "pudb",
    "twisted",
]
link = ["trial"]

[virtualenv.app]
install = ["$DEVELOPMENT/myapp"]

After creating the above, running venvs converge will create 2 virtualenvs, one called “development” with pudb and twisted installed into it and trial linked from within it onto your PATH, and a second called “app” installing the corresponding directory.

For a more intricate example, have a look at my own virtualenvs.toml.

That’s about all you need to know. If you insist on reading further though, venvs has an older, not-very-recommended mutable interface which allows you to create virtualenvs in a central location without tracking them in a config file (or converging them). For that, usage is similar to mkvirtualenv, although venvs passes arguments directly through to virtualenv:

$ venvs create nameofvenv -- -p pypy

will create a virtual environment in an appropriate platform-specific data directory, or in the directory specified by WORKON_HOME for compatibility with virtualenvwrapper.

Single-Purpose Virtualenvs

A common use case for virtualenvs is for single-purpose installations, e.g.:

“I want to install fabric and give it its own virtualenv so that its dependencies can be independently upgraded, all while still being able to use the fab binary globally”.

venvs supports a --link option for this use case:

$ venvs create -i fabric --link fab

will create a virtualenv for fabric (in the same normal location), but will symlink the fab binary from within the virtualenv into your ~/.local/bin directory.

(You may have heard of pipsi which is a similar tool for this use case, but with less customization than I would have liked.)

Temporary Virtualenvs

I also find mktmpenv useful for quick testing. To support its use case, venvs currently supports a different but similar style of temporary virtualenv.

Invoking:

$ venv=$(venvs temporary)

in your shell will create (or re-create) a global temporary virtualenv, and print its bin/ subdirectory (which in this case will be then stored in the venv variable). It can subsequently be used by, e.g.:

$ $venv/python

or:

$ $venv/pip ...

et cetera.

You may prefer using:

$ cd $(venvs temporary)

as your temporary venv workflow if you’re into that sort of thing instead.

The global virtualenv is cleared each time you invoke venvs temporary. Unless you care, unlike virtualenvwrapper’s mktmpenv, there’s no need to care about cleaning it up, whenever it matters for the next time, it will be cleared and overwritten.

venvs may support the more similar “traditional” one-use virtualenv in the future, but given that it does not activate virtualenvs by default (see below), the current recommendation for this use case would be to simply use the virtualenv binary directly.

The 5 Minute Tutorial

Besides the venvs for named-virtualenv creation and venvs temporary for temporary-virtualenv creation described above:

$ venvs find name foo

will output (to standard output) the path to a virtualenv with the given name (see also --existing-only), and:

$ venvs remove foo

will remove it.

There are a number of other slight variants, see the --help information for each of the three binaries.

Real documentation to come (I hope)

Why don’t I use virtualenvwrapper?

virtualenvwrapper is great! I’ve used it for a few years. But I’ve slowly settled on a much smaller subset of its functionality that I like to use. Specifically:

  • I don’t like activating virtualenvs.

    virtualenvs are magical and hacky enough on their own, and piling activation on top just makes things even more messy for me, especially when moving around between different projects in a shell. Some people use cd tricks to solve this, but I just want simplicity.

  • I don’t need project support.

    I’ve never attached a project to a virtualenv. I just use a naming convention, naming the virtualenv with the name of the repo (with simple coercion), and then using dynamic directory expansion in my shell to handle association.

Basically, I just want a thing that is managing a central repository of virtualenvs for me. So that’s what venvs does.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

venvs-7.3.2.tar.gz (26.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

venvs-7.3.2-py2.py3-none-any.whl (23.3 kB view details)

Uploaded Python 2Python 3

File details

Details for the file venvs-7.3.2.tar.gz.

File metadata

  • Download URL: venvs-7.3.2.tar.gz
  • Upload date:
  • Size: 26.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for venvs-7.3.2.tar.gz
Algorithm Hash digest
SHA256 bfa478fac2b60629b6ddce003c166770a08f568b470223bdcfc173de553ab4f6
MD5 41e1e8defe8b267e4a75989a7693c327
BLAKE2b-256 5d583a167d41da52cbc9bf96c900315baaf21a7957e13f5cf72751a7fcdfe6e4

See more details on using hashes here.

File details

Details for the file venvs-7.3.2-py2.py3-none-any.whl.

File metadata

  • Download URL: venvs-7.3.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 23.3 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.7.1 importlib_metadata/4.10.1 pkginfo/1.8.2 requests/2.27.1 requests-toolbelt/0.9.1 tqdm/4.62.3 CPython/3.9.10

File hashes

Hashes for venvs-7.3.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 f57be8c35229b45f86b6a894818e3843ca17b5aa0a0e00cbbcfbd14cb47e52b7
MD5 7e00a2d8576c4efe9ae43da4cf291036
BLAKE2b-256 5072bc1e6056fea957f02eb0965d274aab8132beae9e585fa62175bfaabb6269

See more details on using hashes here.

Release history Release notifications | RSS feed

2026.5.3

6 files

2026.5.2

2 files

2026.5.1

6 files

2025.10.3

2 files

2024.8.2

2 files

2024.5.1

2 files

2024.2.1

2 files

2023.12.2

2 files

2023.10.2

2 files

2023.8.2

2 files

2023.7.1

2 files

2023.5.1

2 files

7.6.0

2 files

7.5.1

2 files

7.4.2

2 files

7.4.0

2 files

This release

7.3.2 This release

2 files

7.3.1

2 files

7.3.0

2 files

7.1.2

2 files

7.1.1

2 files

7.1.0

2 files

7.0.4

2 files

7.0.3

2 files

7.0.2

2 files

7.0.1

2 files

7.0.0

2 files

6.12.4

2 files

6.12.3

2 files

6.12.2

2 files

6.11.13

2 files

6.11.12

2 files

6.11.11

2 files

6.11.10

2 files

6.11.9

2 files

6.11.8

2 files

6.11.7

2 files

6.11.6

2 files

6.11.5

2 files

6.11.4

2 files

6.11.3

2 files

6.11.2

2 files

6.11.1

2 files

6.10.2

2 files

6.10.1

2 files

6.10.0

2 files

6.9.0

2 files

6.8.0

2 files

6.7.1

2 files

6.7.0

2 files

6.6.0

2 files

6.5.0

2 files

6.4.1

2 files

6.4.0

2 files

6.3.0

2 files

6.2.1

2 files

6.2.0

2 files

6.1.0

2 files

6.0.1

2 files

6.0.0

2 files

5.1.0

2 files

5.0.0

2 files

4.2.0

2 files

4.1.1

2 files

4.1.0

2 files

4.0.0

2 files

3.12.0

2 files

3.11.2

2 files

3.11.1

2 files

3.11.0

2 files

3.10.0

2 files

3.9.0

2 files

3.8.0

2 files

3.7.0

2 files

3.6.2

2 files

3.6.1

2 files

3.6.0

2 files

3.5.1

2 files

3.5.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page