Environment layout¶
The interpreter in a created environment answers to more than one name, so a script or tool that hard-codes any of them keeps working. The names below are what the builtin creators write for CPython; PyPy, GraalPy and RustPython follow the same shape under their own executable names.
{minor} stands for the target interpreter’s minor version, so python3.{minor} reads as python3.14 for a
CPython 3.14 target.
POSIX¶
bin holds one real reference to the host interpreter and links the rest to it:
Name |
Notes |
|---|---|
|
References the host interpreter. |
|
Alias. |
|
Alias carrying the target’s minor version. |
|
Free-threaded builds only. |
host executable name |
Appears when the host carries another name, such as |
Windows¶
Scripts holds copies rather than links, since symlinking the interpreter is unreliable there (bpo-42013):
Name |
Notes |
|---|---|
|
References the host interpreter. |
|
Alias. |
|
Alias without the extension. |
|
Free-threaded builds only. |
|
Runs without opening a console window. |
|
Alias for |
|
Free-threaded builds only. |
host executable name |
Appears when the host carries another name, such as |
On CPython 3.13 and later python.exe holds a copy of the venvlauncher.exe redirector from the host’s standard
library rather than the interpreter binary, and pythonw.exe comes from venvwlauncher.exe. The redirector reads
pyvenv.cfg and hands off to the interpreter in the base prefix, which is why the environment needs no copy of the
DLLs. Its own file name stays out of Scripts, matching what the standard library’s venv writes.
Note
--copies makes the POSIX layout use copies instead of links. The set of names does not change.