yeah, all that setup sucks even after being writing python for years.
Nowadays I’ve been running every project with uv and it’s a much better and faster experience, usually in 3 steps: 1. initialize, 2. add dependencies, 3. run project:
# if the project doesn't already have a pyproject.toml with dependencies, initialize it# uv will also install the right interpreter if not present:
uv init --python 3.13
# anything you would install with pip, use uv add:
uv add dep1 dep2
# run the project / script
uv run main.py
Then in future runs (as long as you have the pyproject.toml), you can just do uv run main.py (shorthand to uv run python main.py), even when there’s no venv created. No more activating virtual envs. No more long interpreter installations. No more accidentally messing with system’s packages or the PATH variable. With the uv.lock that’s also a lot more reliable to reproduce than requirements.txt and similar.
yeah, all that setup sucks even after being writing python for years.
Nowadays I’ve been running every project with
uv
and it’s a much better and faster experience, usually in 3 steps: 1. initialize, 2. add dependencies, 3. run project:# if the project doesn't already have a pyproject.toml with dependencies, initialize it # uv will also install the right interpreter if not present: uv init --python 3.13 # anything you would install with pip, use uv add: uv add dep1 dep2 # run the project / script uv run main.py
Then in future runs (as long as you have the pyproject.toml), you can just do
uv run main.py
(shorthand touv run python main.py
), even when there’s no venv created. No more activating virtual envs. No more long interpreter installations. No more accidentally messing with system’s packages or the PATH variable. With theuv.lock
that’s also a lot more reliable to reproduce thanrequirements.txt
and similar.