A terminal based user interface for managing Python installs and virtual environments.
The easiest way to install ducktools.pytui is as a tool from PyPI using uv or pipx.
uv tool install ducktools-pytui or pipx install ducktools-pytui
Run with pytui or ducktools-pytui.
There is also now a zipapp available on the releases page and should be usable as long as you have Python 3.10 or newer.
- List Python Virtual Environments relative to the current folder alongside those installed in a configurable global folder
- List Python Runtimes discovered by ducktools-pythonfinder
- Launch a Terminal with a selected venv activated
- Currently only fish, bash (and git bash on Windows), zsh, powershell and cmd are supported
- zsh and cmd only have basic support
- Use
exitto close the shell and return to PyTUI
- Currently only fish, bash (and git bash on Windows), zsh, powershell and cmd are supported
- Launch a REPL with the selected venv
- Launch a REPL with the selected runtime
- List installed packages in a venv (Python 3.9 or later)
- Create a venv from a specific runtime in the working directory or a global folder (Python 3.4 or later)
- Delete a selected venv
- Install a runtime (Requires either the Windows Python Manager or UV to be available)
- Uninstall a runtime (Only those managed by the Windows Python Manager or UV)
Some configuration is available by editing the config.json file located here:
- Windows:
%LOCALAPPDATA%\ducktools\pytui\config.json - Non-Windows:
~/.config/ducktools/pytui/config.json
Config can be seen and edited from the commandline with the config subcommand.
Some example commands:
pytui config- Shows the location of the config file and its current statepytui config -h- Shows the options for modifying the config filepytui config --exclude-pip- Preventpipfrom being included
venv_search_mode- Where to search for VEnv folders"cwd"- Search in the working directory only"parents"- Search in the working directory and each parent folder (default)"recursive"- Search in the working directory and subfolders recursively"recursive_parents"- Combine the "recursive" and "parents" options (only the CWD is recursively searched)
include_pip- Whether to includepip(andsetuptoolswhere appropriate) in created VEnvs (default:True)latest_pip- Download the latestpipfor Python versions where it is available (default:True)global_venv_folder- The folder to use for global pytui venvs,~/.local/share/ducktools/pytui/venvsby defaultshell_path- Path to the shell used to launch activated venvs
The Python install discovery cache is handled by the ducktools-pythonfinder package.
The easiest way to clear the cache is to use the ducktools-pythonfinder commandline.
- With uv:
uvx ducktools-pythonfinder clear-cache - With pipx:
pipx run ducktools-pythonfinder clear-cache - With the pythonfinder zipapp:
python pythonfinder.pyz clear-cache
By default PyTUI will check your $SHELL variable if it is set for the path to your default shell.
If this exists and is a supported shell it will be used. Otherwise it will search PATH for shells
in this order:
- Windows:
pwsh.exe,powershell.exe,cmd.exe,bash.exe - Non-Windows:
fish,bash,zsh
On Windows as a last resort if none of these are found it will search for the COMSPEC environment
variable to find a path to cmd.exe.
A data folder of shell scripts is kept in this location:
- Windows: `%LOCALAPPDATA%\ducktools\pytui\shell_scripts
- Non-Windows:
~/.local/share/ducktools/pytui/shell_scripts
- Support other common shells
- Highlight broken venvs where the base install no longer exists
- Handle PEP-723 inline scripts
ducktools-envis my project for managing these- Potentially that could gain a TUI, but I'm not sure I'd want to merge the two things
- Handle Conda environments
- Conda environments are a completely separate ecosystem, while everything this supports uses the standard PyPI ecosystem
- Supporting Conda would basically require a whole separate parallel set of commands
- Manage
ducktools-pytuispecific runtimes- I don't want to add yet another place Python can be installed
ducktools-pytuiis intended to help manage the chaos of Python runtime installs and environments, not add a new dimension to it


