A Folder Structure
venv
You don’t need to dig deeply into this folder structure to learn more about what virtual environments are made of. In just a bit, you’ll carefully scrape off the topsoil and investigate the high-level structures that you uncover.
However, if you’ve already got your shovel ready and you’re itching to dig, then open the collapsible section below:
PS> tree venv /F
$ tree venv
$ tree venv
site-packages/
venv\
│
├── Include\
│
├── Lib\
│ │
│ └── site-packages\
│ │
│ ├── _distutils_hack\
│ │
│ ├── pip\
│ │
│ ├── pip-22.0.4.dist-info\
│ │
│ ├── pkg_resources\
│ │
│ ├── setuptools\
│ │
│ ├── setuptools-58.1.0.dist-info\
│ │
│ └── distutils-precedence.pth
│
│
├── Scripts\
│ ├── Activate.ps1
│ ├── activate
│ ├── activate.bat
│ ├── deactivate.bat
│ ├── pip.exe
│ ├── pip3.10.exe
│ ├── pip3.exe
│ ├── python.exe
│ └── pythonw.exe
│
└── pyvenv.cfg
venv/
│
├── bin/
│ ├── Activate.ps1
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── pip
│ ├── pip3
│ ├── pip3.10
│ ├── python
│ ├── python3
│ └── python3.10
│
├── include/
│
├── lib/
│ │
│ └── python3.10/
│ │
│ └── site-packages/
│ │
│ ├── _distutils_hack/
│ │
│ ├── pip/
│ │
│ ├── pip-22.0.4.dist-info/
│ │
│ ├── pkg_resources/
│ │
│ ├── setuptools/
│ │
│ ├── setuptools-58.1.0.dist-info/
│ │
│ └── distutils-precedence.pth
│
├── lib64/
│ │
│ └── python3.10/
│ │
│ └── site-packages/
│ │
│ ├── _distutils_hack/
│ │
│ ├── pip/
│ │
│ ├── pip-22.0.4.dist-info/
│ │
│ ├── pkg_resources/
│ │
│ ├── setuptools/
│ │
│ ├── setuptools-58.1.0.dist-info/
│ │
│ └── distutils-precedence.pth
│
└── pyvenv.cfg
venv/
│
├── bin/
│ ├── Activate.ps1
│ ├── activate
│ ├── activate.csh
│ ├── activate.fish
│ ├── pip
│ ├── pip3
│ ├── pip3.10
│ ├── python
│ ├── python3
│ └── python3.10
│
├── include/
│
├── lib/
│ │
│ └── python3.10/
│ │
│ └── site-packages/
│ │
│ ├── _distutils_hack/
│ │
│ ├── pip/
│ │
│ ├── pip-22.0.4.dist-ino/
│ │
│ ├── pkg_resources/
│ │
│ ├── setuptools/
│ │
│ ├── setuptools-58.1.0.dist-info/
│ │
│ └── distutils-precedence.pth
│
└── pyvenv.cfg
This reduced tree structure gives you a better overview of what’s going on in your virtual environment folder:
Include\Lib\site-packages\pipScripts\python.exepippip.exeactivatepyvenv.cfgsysbin/pythonpippippython3python3.10pip3pip3.10activateinclude/lib/site-packages/python3.10/site-packages/piplib64/lib/lib/lib64/pyvenv.cfgsysbin/pythonpippippython3python3.10pip3pip3.10activateinclude/lib/site-packages/python3.10/site-packages/pippyvenv.cfgsys
From this bird’s-eye view of the contents of your virtual environment folder, you can zoom out even further to discover that there are three essential parts of a Python virtual environment:
pyvenv.cfg
site-packages/
venvpippippippip
pippip list
(venv) PS> python -m pip list
Package Version
---------- -------
pip 22.0.4
setuptools 58.1.0
(venv) $ python -m pip list
Package Version
---------- -------
pip 22.0.4
setuptools 58.1.0
Your version numbers may differ, but this output confirms that Python installed both packages when you created the virtual environment with its default settings.
pippip
site-packages/
distutils-precedence.pthdistutils_distutils_hackdistutils
site-packages/
venv
Keep in mind that your virtual environment is just a folder structure, which means that you can delete and re-create it anytime you want to. But why this specific folder structure, and what does it make possible?