One of the major features of Python 3.3 is the new venv module, allowing the creation of Python virtual environments on your system.
1. What is a virtual environment?
A virtual environment is a directory dedicated to the execution of your Python applications. Activating your virtual environment will force Python to execute in this directory as the top level of this directory was the root of your file system.
The virtual environments are interesting because of the independence they have toward the host they run on, especially when you want to install several versions of Python or if you want to install lots of dependencies without being the system administrator of the host.
If you are a Python developer, you must know virtualenv. This really nice application offers a nice way to create Python virtual environment. Moreover it comes with pip already installed in your virtual environment, in order to install other dependencies you need in a really convenience way.
Starting from Python 3.3, the module venv of the Python standard library offers the users to create virtual environments. This new feature will encourage all users to create virtual environments to develop their own Python applications, which is a good practice. Thanks to the experiences of several applications being used in the Python community, the module venv was written to be really efficient and widely available.
The Python Enhancement Proposal 405 (PEP405) offers a really interesting reading if you wish to find more information about this topic.
2. Creating a virtual environment with Python 3.3
With Python 3.3 comes pyvenv-3.3, allowing to create Python virtual environment:
$ pyvenv-3.3 myvirtualenv $ cd myvirtualenv/ $ tree . . ├── bin │ ├── activate │ ├── pydoc │ ├── python -> python3.3 │ ├── python3 -> python3.3 │ └── python3.3 -> /usr/bin/python3.3 ├── include ├── lib │ └── python3.3 │ └── site-packages └── pyvenv.cfg
As we can see, three directories were created.
- bin/ offers the activate script and different links to the executable python3.3
- lib/ offers a tree of directories where the libraries and packages you install in your virtual environment will be stored
- include/ is by default empty
- pyvenv.cfg offers different configuration options
$ cat pyvenv.cfg home = /usr/bin include-system-site-packages = false version = 3.3.2
Just before moving on, if you want to use the existing modules in your global site-packages directory on your system, the option –system-site-packages is available.
3. Activate the virtual environment
Lets activate our virtual environment. We need to use the bin/activate file in this environment:
$ source bin/activate (myvirtualenv) $
A change in our prompt indicated the good activation of the virtual environment.
4. Installing applications in the virtual environment
But playing around with only the default Python interpreter is not really funny. Lets download pip, the Python installer, but before that we need a dependency setuptools:
(myvirtualenv) $ curl https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -o ez_setup.py % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 11356 100 11356 0 0 18507 0 --:--:-- --:--:-- --:--:-- 18495 (myvirtualenv) $ curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py -o get-pip.py % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 543k 100 543k 0 0 685k 0 --:--:-- --:--:-- --:--:-- 685k
Now lets install Setuptools and Pip:
(myvirtualenv) $ python3.3 ez_setup.py Downloading https://pypi.python.org/packages/source/s/setuptools/setuptools-2.0.tar.gz Extracting in /tmp/tmpxlrv7q Now working in /tmp/tmpxlrv7q/setuptools-2.0 Installing Setuptools ... (lots of lines)... Installed /tmp/myvirtualenv/lib/python3.3/site-packages/setuptools-2.0-py3.3.egg Processing dependencies for setuptools==2.0 Finished processing dependencies for setuptools==2.0 (myvirtualenv) $ python3.3 get-pip.py Downloading/unpacking pip Downloading pip-1.4.1.tar.gz (445kB): 445kB downloaded Running setup.py egg_info for package pip ... (lots of lines)... Successfully installed pip Cleaning up...
Ok now we’re ready to use pip to install anything we need in our virtual environment. Lets think one more second about what we did: we install the Setuptools and the Pip application inside our virtual environment, with nothing written on our main system. Now lets try to install Brebis, the fully automated backup checker, and run it in this environment:
(myvirtualenv) $ pip-3.3 install brebis Downloading/unpacking brebis Downloading brebis-0.8.tar.gz Running setup.py egg_info for package brebis Installing collected packages: brebis Running setup.py install for brebis changing mode of build/scripts-3.3/brebis from 644 to 755 changing mode of /tmp/myvirtualenv/bin/brebis to 755 Successfully installed brebis Cleaning up...
We’re now ready to launch Brebis, executing in our virtual environment:
(myvirtualenv) $ brebis -h usage: brebis [-h] [-c DIR] [-C DIR] [-d DELIMITER] [-g] [-G] [-l FILE] [-L DIR] [-O DIR] [-v] Fully automated backup checker positional arguments: archives archives to check optional arguments: -h, --help show this help message and exit -c DIR, --configpath DIR the path to the configurations -C DIR, --output-conf-dir DIR the directory to store the configuration file -d DELIMITER, --delimiter DELIMITER delimiter of the fields for the list of files -g, --gen-list generate a list of files inside a backup -G, --gen-full generate the configuration file and the list of files for the backup -l FILE, --log FILE the log file -L DIR, --output-list-dir DIR the directory to store the list of files inside an archive or tree -O DIR, --output-list-and-conf-dir DIR the directory to store the configuration file and the list of files inside an archive or tree -v, --version print the version of this program and exit For more information: http://www.brebisproject.org
So we get an execution of the Brebis application inside our virtual environment, installed from our virtual environment with tools installed only in the virtual environment.
That’s a big step that such a feature is now included in the standard library. In the future, you will enjoy the possibility to create new virtual environments for each Python version right out of the box. Moreover, using the –upgrade option of the pyvenv command, you will upgrade, if needed, your virtual environment in a really easy and straightforward way, making environments adaptable in time.
What about you? What do you think about the Python 3 virtual environments and their features, given your own needs? Feel free to use the comments section of this post.