Using tn-venv from Python
The CLI is a thin wrapper over a programmatic API, so build scripts, test harnesses, and installer tools can create environments without shelling out.
The one-call API
from tn_venv import create_venv
result = create_venv(
".venv",
python="3.12", # str, list of specs, or None
clear=False,
upgrade=False,
system_site_packages=False,
copies=None, # None = platform default
with_pip=True,
pip="24.0", # None | "latest" | exact version
setuptools=True, # bool or pinned version string
wheel=True,
upgrade_pip=False,
packages=["requests"],
requirements=["dev-requirements.txt"],
activators=["bash", "powershell"],
prompt="my-project",
offline=False,
extra_search_dir=["/srv/wheels"],
quiet=True, # False = stream progress to stdout
)
create_venv() returns a SessionResult:
result.env_dir # Path — the environment directory
result.exe # Path — the environment's python executable
result.bin_path # Path — Scripts/ (Windows) or bin/ (POSIX)
result.site_packages # Path — the environment's site-packages
result.prompt # str — the prompt baked into activation scripts
result.python # PythonInfo — the probed base interpreter
result.activation_scripts # list[Path] — every script that was generated
result.seed # SeedResult | None — what the seeder installed
result.seed is None when seeding was disabled (with_pip=False);
otherwise it records the installed pip version, whether setuptools and
wheel were installed, and which packages / requirements were applied.
result.python carries the full probe of the base interpreter —
version_info, implementation, base_executable, bits,
is_freethreaded, and more. See Python API reference.
Errors
All deliberate failures raise from a single hierarchy:
from tn_venv import TNError, InterpreterNotFoundError, CreateError, SeedError
try:
create_venv("/srv/app/.venv", python="3.99")
except InterpreterNotFoundError as exc:
print(exc.spec, exc.tried) # the spec and every candidate probed
except TNError as exc:
print("creation failed:", exc)
Exception |
Raised when |
|---|---|
|
options are contradictory or malformed |
|
no candidate satisfies any |
|
a candidate executable cannot be probed |
|
the destination cannot be created or binaries installed |
|
ensurepip/pip fails inside the new environment |
|
the destination lock cannot be acquired in time |
Running the CLI in-process
from tn_venv import cli_run
exit_code = cli_run([".venv", "--clear", "-p", "3.12"])
cli_run() parses arguments, applies the full configuration stack
(env vars and config files included, unless --no-config), and returns the
process exit code — 0, 1, 2, or 130 — as documented in
Exit codes. Pass environ={...} to run it against a
controlled environment.