Editable Python installs in git worktrees without copying heavy dependencies.
Project description
devpy-runner
Editable Python installs in git worktrees without copying heavy dependencies.
devpy runs commands inside a shared conda environment with a
git-worktree-local .venv overlay. Use it when conda owns the heavy dependency
stack and each worktree needs its own editable Python installs.
Why
Git worktrees are useful for working on multiple branches at once, but Python editable installs make them easy to misuse:
- one shared conda env can accidentally import code from the wrong worktree
- one full conda env per worktree duplicates large dependencies
PYTHONPATHskips normal package metadata and console scripts
devpy keeps the split explicit:
- conda env: heavy shared dependencies
- worktree
.venv: editable local packages and console scripts devpy.toml: the worktree's configuration
You do not need to conda activate the shared environment before running
devpy commands. devpy reads devpy.toml, applies the configured conda
environment to the child process, and keeps the worktree .venv/bin first on
PATH.
Status
Version 1 is intentionally conda-only. It does not solve dependency management for every Python project; it solves the conda-backed worktree overlay workflow.
Install
From PyPI:
python -m pip install devpy-runner
For development from this checkout:
python -m pip install -e ".[dev]"
Check the command:
devpy --help
Quick Start
Create a shared conda environment that has your normal dependencies, but not the editable package you are developing:
conda create -n myproject-shared python=3.11 pip -y
conda run -n myproject-shared python -m pip install -U pip
In a git worktree, add devpy.toml at the git root:
[python]
base_conda_env = "myproject-shared"
[editables]
packages = [
".",
]
Create the worktree .venv and install configured editables:
devpy update-editables
Run commands through the worktree environment:
devpy python -c "import sys; print(sys.executable)"
devpy pytest
devpy python scripts/example.py
These commands do not require conda activate myproject-shared first. The
configured conda env still supplies native libraries, activation-script
environment variables, and shared dependencies.
Verify that your editable package is imported from the current worktree:
devpy python -c "import mypackage; print(mypackage.__file__)"
Worktree-Local Config
If devpy.toml is local machine config, ignore it with the git worktree's
exclude file. In git worktrees, .git may be a file, so use git rev-parse:
EXCLUDE="$(git rev-parse --git-path info/exclude)"
mkdir -p "$(dirname "$EXCLUDE")"
printf '\n# Local devpy config\n/devpy.toml\n/.venv/\n' >> "$EXCLUDE"
If devpy.toml should be shared by the team, commit it instead and only ignore
.venv/.
Multiple Editable Packages
One worktree can own an environment for several local packages:
[python]
base_conda_env = "myproject-shared"
[editables]
packages = [
".",
"../some-sibling-package",
"../another-sibling-package",
]
Editable paths are resolved relative to the git root. They may point to sibling
checkouts. The .venv path defaults to .venv and must stay inside the git
root.
Commands
Show configuration without creating .venv:
devpy info
Create .venv if needed and install configured editables:
devpy update-editables
Run normal commands inside the configured conda env, with .venv/bin first on
PATH:
devpy python -m pytest
devpy pytest
devpy my-console-script --help
Remove the worktree .venv:
devpy clean
Editable Installs
Editable installs are configured in devpy.toml, not through ad hoc pip
commands.
These intentionally fail:
devpy pip install -e .
devpy pip install --editable ../some-package
devpy python -m pip install -e .
Use this instead:
[editables]
packages = [
".",
"../some-package",
]
devpy update-editables
By default, update-editables uses pip install --no-deps -e ... because the
base conda environment is expected to own dependencies. If a repo really needs
editable dependencies installed into .venv, set:
[editables]
install_deps = true
packages = ["."]
Config Reference
[python]
base_conda_env = "myproject-shared"
venv = ".venv"
[editables]
packages = ["."]
install_deps = false
Fields:
python.base_conda_env: required conda environment name.python.venv: optional worktree-local virtual environment path. Defaults to.venv.editables.packages: editable package paths, relative to the git root.editables.install_deps: whether pip should install dependencies while installing editables. Defaults tofalse.
Troubleshooting
If devpy is not found, install it in the active Python environment:
python -m pip install --upgrade devpy-runner
If devpy says missing devpy.toml, make sure you are inside a git worktree
and that devpy.toml exists at the git root:
git rev-parse --show-toplevel
If imports come from the wrong place, check the active paths:
devpy info
devpy python -c "import mypackage; print(mypackage.__file__)"
If .venv gets stale, remove and recreate it:
devpy clean
devpy update-editables
Unsupported By Design
Version 1 does not support uv-managed environments, non-conda base environments, or automatic dependency solving. Those can be added later if the conda-backed overlay workflow proves useful.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file devpy_runner-0.1.2.tar.gz.
File metadata
- Download URL: devpy_runner-0.1.2.tar.gz
- Upload date:
- Size: 10.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa37c3f78369cf74dcfcfcd14ce64e6b3d376ccafd40d6cfd3a55c2ca433db3a
|
|
| MD5 |
8e5b8e69c50d4af4a07dbe18f00bfc02
|
|
| BLAKE2b-256 |
5d39cd01df0ad2668d913672610b6d16d7885b49e2b66aa939e4ab3ba9f68666
|
Provenance
The following attestation bundles were made for devpy_runner-0.1.2.tar.gz:
Publisher:
release.yml on alik-git/devpy-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devpy_runner-0.1.2.tar.gz -
Subject digest:
fa37c3f78369cf74dcfcfcd14ce64e6b3d376ccafd40d6cfd3a55c2ca433db3a - Sigstore transparency entry: 1530546637
- Sigstore integration time:
-
Permalink:
alik-git/devpy-runner@9dcab07fe8e6c4be381dada6ec3a38307a44fe43 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/alik-git
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9dcab07fe8e6c4be381dada6ec3a38307a44fe43 -
Trigger Event:
release
-
Statement type:
File details
Details for the file devpy_runner-0.1.2-py3-none-any.whl.
File metadata
- Download URL: devpy_runner-0.1.2-py3-none-any.whl
- Upload date:
- Size: 7.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf4f42d4ff7f1145a26b3329ffb188b6551758fb04e14d202738fb7af86f694d
|
|
| MD5 |
06a94400f0014a3deda75f6c80a9fa52
|
|
| BLAKE2b-256 |
cd5024a153e25c1b003c1ffb44e39c7537b4acd966d81fb9765f6b4f9b7884e9
|
Provenance
The following attestation bundles were made for devpy_runner-0.1.2-py3-none-any.whl:
Publisher:
release.yml on alik-git/devpy-runner
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
devpy_runner-0.1.2-py3-none-any.whl -
Subject digest:
cf4f42d4ff7f1145a26b3329ffb188b6551758fb04e14d202738fb7af86f694d - Sigstore transparency entry: 1530546752
- Sigstore integration time:
-
Permalink:
alik-git/devpy-runner@9dcab07fe8e6c4be381dada6ec3a38307a44fe43 -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/alik-git
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9dcab07fe8e6c4be381dada6ec3a38307a44fe43 -
Trigger Event:
release
-
Statement type: