13.3. Module venv
Isolated Python environment
Allows to have multiple versions of Python for one project
For testing on different versions:
python3.11
,python3.12
,python3.13
Test libraries and frameworks before upgrading (create venv, install requirements, run tests, delete if fails)
Allows to have different versions of libraries and frameworks for each project
Difference between
venv
andvirtualenv
venv
is bundled with Python since 3.3 (no installation required)virtualenv
is independent package installed viapip
virtualenvwrapper
is additionally installed command line tools
13.3.1. Venv vs Virtualenv
Both venv
and virtualenv
are used to create isolated
Python environments. Since Python 3.3, a subset of virtualenv
has been integrated into the standard library under the venv
module.
Both venv
and virtualenv
:
Author: Bernat Gabor
Support: Python 3
Module venv
:
Python: version 3 only
Install: not required - bundled with Python since Python 3.3
Usage:
python3.12 -m venv DIRECTORY
Development: synchronized with Python releases
Features: all you need
Module virtualenv
:
Python: version 2 and 3
Install:
pip install virtualenv
Usage:
virtualenv DIRECTORY
Development: independent from Python releases
Features: all from
venv
plus extra (which typically you don't need)
In my opinion builtin venv
is all you need. Moreover no installation
is required to use it.
13.3.2. Create
venv-py312
is the name of venv folderSee "Directory Naming Convention" below
Create virtual environment in directory named venv-py312
:
$ python3.12 -m venv venv-py312
13.3.3. Run Ad-Hoc
Will run python with from virtual environment
With all the modules already installed
Run myscript.py
using virtual environment:
$ venv-py312/bin/python3 myscript.py
13.3.4. Activate
bin
for macOS, Linux, BSDScripts
for WindowsNote the direction of slash and backslash (OS dependent)
There is a slight difference between activating virtual environment on macOS, Linux, BSD and Windows.
Linux, macOS, BSD:
$ source venv-py312/bin/activate
Windows:
$ venv-py312\Scripts\activate.bat
13.3.5. Install Modules Ad-Hoc
Install new module:
$ venv-py312/bin/python -m pip install MODULE
Install modules listed in requirements.txt
$ venv-py312/bin/python -m pip install -r requirements.txt
Upgrade modules listed in requirements.txt:
$ venv-py312/bin/python -m pip install --upgrade -r requirements.txt
List installed modules:
$ venv-py312/bin/python -m pip freeze
13.3.6. Directory Naming Convention
No standard naming convention
Naming directory like module (
venv
) name is a good ideaAdding Python version is also a good practice
Optionally naming per main framework/library version
Dot at the beginning hides directory on Linux and macOS (but doesn't work on Windows)
Underscore is Python convention for private/protected, but does not work for OS and Git
venv # may be confused with ``venv`` Python module, mind: ``sys.path``
venv-py
venv-py311
venv-py312
venv-py312-dj50
venv-py312-dj51
venv-py312-dj52
venv-py312-np126
venv-py312-np20
venv-py312-np126-pd22
venv-py312-np20-pd22
venv-py313a1
venv-py313b1
venv-py313rc1
13.3.7. Good Practices
python3.12 -m venv -h
python3.12 -m venv --upgrade-deps venv-py312
Name venv directory similar to python version
venv-py3.12
Place in your project directory
Add venv directory to
.gitignore
(important!)Change prompt by appending at the end of
venv-3.12/bin/activate
:
13.3.8. Bash Prompt
Default on most Linux distributions
\e[
– This string tells bash prompt to apply color from next character.0;32m
– This string represents the colors. The number before the; represent typeface. And the number after the ; represent color code.\e[0m
– This string will tell the bash prompt to apply the color to the previous character.
Typeface:
0 – Normal
1 – Bold
2 – Dim
4 – Underlined
Color codes:
30 – Black
31 – Red
32 – Green
33 – Brown
34 – Blue
35 – Purple
36 – Cyan
37 – Light gray
Define variables for Bash colors:
blue='\e[0;34m'
brown='\e[0;33m'
cyan='\e[0;36m'
gray='\e[0;37m'
green='\e[0;32m'
purple='\e[0;35m'
red='\e[0;31m'
white='\e[0;39m'
Set Bash prompt:
export PS1="\n${cyan}myproject> ${white}"
13.3.9. Zsh Prompt
Default on macOS
Colors: black, blue, cyan, green, magenta, red, white, yellow
export PROMPT="%F{cyan}myproject> %F{white}"
Optionally you can also set options:
setopt PROMPT_CR
setopt PROMPT_SP
export PROMPT_EOL_MARK=""
13.3.10. Shebang
Using #!/usr/bin/env python3
in a shebang line has several
advantages over #!/usr/bin/python3
:
Portability:
#!/usr/bin/env python3
searches thePATH
environment variable to locate the Python interpreter, allowing scripts to be more portable across different systems. It ensures that the correct version of Python specified by the environment is used, rather than relying on a hardcoded path that may vary between systems.Virtual Environments: When working with virtual environments, using
#!/usr/bin/env python3
ensures that the interpreter within the virtual environment is used. This allows scripts to utilize dependencies and configurations specific to the virtual environment, rather than the system-wide Python interpreter.Flexibility: The env command allows for flexibility in specifying the Python interpreter. For example, if a script is designed to work with Python 3.11 but is executed on a system with Python 3.12 installed,
#!/usr/bin/env python3
will use the correct version without needing to modify the shebang line.Avoids Hardcoding Paths: Hardcoding the path to the Python interpreter (
#!/usr/bin/python3
) can lead to issues if the interpreter is located in a different directory on the target system. Using#!/usr/bin/env python3
avoids this problem by dynamically locating the interpreter based on the environment.
Overall, #!/usr/bin/env python3
provides a more flexible and portable
solution for specifying the Python interpreter in a shebang line, making
scripts easier to maintain and distribute across different environments.
13.3.11. Further Reading
13.3.12. Assignments
"""
* Assignment: Virtualenv
* Complexity: easy
* Lines of code: 0 lines
* Time: 2 min
English:
1. Create `venv` for newest Python version
2. Add `venv` as a Python interpreter in your IDE
3. Run doctests - all must succeed
Polish:
1. Stwórz `venv` dla najnowszej wersji Python
2. Dodaj `venv` jako interpreter Python w Twoim IDE
3. Uruchom doctesty - wszystkie muszą się powieść
"""