Jupyterlab extension to detect notebook kernels similarly to how nb_conda_kernel does
Project description
nb_venv_kernels
Use Python virtual environments as Jupyter kernels. Discovers and registers kernels from venv, uv, and conda environments in JupyterLab's kernel selector.
Discovered environments appear in JupyterLab's kernel selector.
CLI provides environment listing with status indicators.
Scan for environments directly from JupyterLab's Kernel menu.
Results display in a modal with action indicators.
Features
- Unified kernel discovery - conda, venv, and uv environments in one kernel selector
- Auto-detection - distinguishes uv from venv via
pyvenv.cfg - Smart ordering - current environment first, then conda, uv, venv, system
- Drop-in replacement - replaces nb_conda_kernels while preserving all conda functionality
- Directory scanning - scan project directories to find and register environments
- JupyterLab integration - scan for environments from Kernel menu with results modal
- CLI management - register, unregister, scan, list with color-coded status indicators
- Programmatic API - REST endpoints and Python API for automation (
--jsonflag) - Zero config - auto-enables on install, works immediately
Built because someone got tired of typing python -m ipykernel install --user --name=... for the 42nd time.
Install
This package should be installed in the environment from which you run Jupyter Notebook or JupyterLab. This might be your base conda environment, but it need not be. For instance, if you have a dedicated jupyter_env environment:
conda activate jupyter_env
pip install nb_venv_kernels
Or install directly with pip/uv if not using conda:
pip install nb_venv_kernels
The extension auto-enables as the default kernel spec manager via jupyter_config.json. If nb_conda_kernels is installed, nb_venv_kernels takes precedence and includes all conda kernel discovery functionality.
Usage
Virtual environments require ipykernel installed to be discoverable. The ipykernel package creates the kernel spec at {env}/share/jupyter/kernels/*/kernel.json.
# In your virtual environment
pip install ipykernel
Scanning for Environments
Scan a directory tree to find and register all venv/uv environments:
nb_venv_kernels scan # Scan current directory
nb_venv_kernels scan /path/to/projects # Scan specific directory
nb_venv_kernels scan --depth 3 # Limit recursion depth (default: 5)
The scan command automatically:
- Finds venv and uv environments by detecting
bin/python - Registers them in the appropriate registry (
~/.venv/or~/.uv/) - Cleans up non-existent environments from registries
- Reports conda environments found (they are discovered via
conda env list)
Manual Registration
nb_venv_kernels register /path/to/.venv
nb_venv_kernels unregister /path/to/.venv
Listing Environments
The list command shows all environments (conda, uv, venv) with their status:
nb_venv_kernels list
name type exists kernel path
--------------------------------------------------------------------------------------------------------------
base conda yes yes /opt/conda
my-conda-env conda (local) yes yes /opt/conda/envs/my-conda-env
my-project uv yes yes /home/user/my-project/.venv
another-project venv yes no /home/user/another-project/venv
Environments are sorted by type (conda, uv, venv) then by name. The KERNEL column indicates whether ipykernel is installed. Missing environments and kernels display "no" in red.
Jupyter Configuration
nb_venv_kernels config enable # Enable VEnvKernelSpecManager
nb_venv_kernels config disable # Disable VEnvKernelSpecManager
nb_venv_kernels config show # Show current config status
Registered environments with ipykernel appear in JupyterLab's kernel selector.
Environment Registries
Environments are registered in separate files based on their source:
- venv:
~/.venv/environments.txt - uv:
~/.uv/environments.txt - conda:
~/.conda/environments.txt+ global environments fromconda env list
The register command auto-detects uv environments via pyvenv.cfg and writes to the appropriate registry.
How It Works
flowchart LR
subgraph CLI
SCAN[nb_venv_kernels scan]
REG[nb_venv_kernels register]
end
subgraph Registries
VENV[~/.venv/environments.txt]
UV[~/.uv/environments.txt]
CONDA_REG[~/.conda/environments.txt]
end
subgraph Auto-Discovery
CONDA_ENV[conda env list]
PYVENV[pyvenv.cfg]
end
subgraph Discovery
KSPM[VEnvKernelSpecManager]
CKSPM[CondaKernelSpecManager]
end
SCAN -->|finds envs| VENV
SCAN -->|finds envs| UV
REG -->|registers| UV
PYVENV -.->|detects uv| UV
VENV --> KSPM
UV --> KSPM
CONDA_REG --> CKSPM
CONDA_ENV --> CKSPM
CKSPM --> KSPM
KSPM --> JL[JupyterLab Kernel Selector]
style SCAN stroke:#10b981,stroke-width:2px
style REG stroke:#10b981,stroke-width:2px
style VENV stroke:#10b981,stroke-width:2px
style UV stroke:#a855f7,stroke-width:2px
style CONDA_REG stroke:#f59e0b,stroke-width:2px
style CONDA_ENV stroke:#f59e0b,stroke-width:2px
style PYVENV stroke:#6b7280,stroke-width:2px
style KSPM stroke:#3b82f6,stroke-width:3px
style CKSPM stroke:#f59e0b,stroke-width:2px
style JL stroke:#0284c7,stroke-width:3px
- Scans
{path}/share/jupyter/kernels/*/kernel.jsonfor each registered environment - Configures kernel to use venv's python directly with
VIRTUAL_ENVandPATHenvironment variables - Kernel order: current environment first, then conda, uv, venv, system
- Caches results for 60 seconds
config enablebacks up existing config,config disablerestores from backup
Configuration
Optional settings in jupyter_server_config.py:
c.VEnvKernelSpecManager.venv_only = True # Hide system/conda kernels
c.VEnvKernelSpecManager.env_filter = r"\.tox|\.nox" # Exclude by pattern
c.VEnvKernelSpecManager.name_format = "{language} [{source} env:{environment}]" # Default format
c.VEnvKernelSpecManager.scan_depth = 7 # Default depth for scan command
Display name variables: {language}, {environment}, {source} (uv/venv), {kernel}, {display_name}
Programmatic API
The extension provides REST and Python APIs for integration with tools and automation. See API Documentation for details on:
- REST endpoints - /nb-venv-kernels/environments, /scan, /register, /unregister
- Python API - VEnvKernelSpecManager methods for listing, scanning, and registering environments
- JSON output - CLI commands support
--jsonflag for machine-to-machine communication
flowchart LR
subgraph Interfaces
CLI[nb_venv_kernels CLI]
MENU[JupyterLab Kernel Menu]
end
subgraph Server[Jupyter Server]
REST[REST Endpoints<br>/nb-venv-kernels/*]
end
MGR[VEnvKernelSpecManager]
subgraph Storage
VENV_REG[~/.venv/environments.txt]
UV_REG[~/.uv/environments.txt]
end
CLI --> MGR
MENU --> REST
REST --> MGR
MGR --> VENV_REG
MGR --> UV_REG
style CLI stroke:#10b981,stroke-width:2px
style MENU stroke:#0284c7,stroke-width:2px
style REST stroke:#f59e0b,stroke-width:2px
style MGR stroke:#3b82f6,stroke-width:3px
style VENV_REG stroke:#10b981,stroke-width:2px
style UV_REG stroke:#a855f7,stroke-width:2px
CLI calls VEnvKernelSpecManager directly. JupyterLab frontend uses REST endpoints. Both produce identical sorted output.
Uninstall
pip uninstall nb_venv_kernels
After uninstall, nb_conda_kernels (if installed) will resume handling kernel discovery.
Project details
Release history Release notifications | RSS feed
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 nb_venv_kernels-1.1.30.tar.gz.
File metadata
- Download URL: nb_venv_kernels-1.1.30.tar.gz
- Upload date:
- Size: 975.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b58c33eecf3d0f5f21deec026c926f5b918333344543d875055f5a23a947334b
|
|
| MD5 |
282505d894bc87b859cf4a8eb7b2ca7e
|
|
| BLAKE2b-256 |
7d8b7062990e36debb356b06c7e0c3d3d69217889ba8af52ad988eec7a0a9906
|
File details
Details for the file nb_venv_kernels-1.1.30-py3-none-any.whl.
File metadata
- Download URL: nb_venv_kernels-1.1.30-py3-none-any.whl
- Upload date:
- Size: 46.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95c886d5e6a8702bcf66a8a7308bb74c753da883c4c5eb58c086ed0269a7a225
|
|
| MD5 |
168565bc9424d72fcc75b15f186facf7
|
|
| BLAKE2b-256 |
4a685f393500d6b7c193998bcc0b5f1cb3ac9c647f4d3d36fbc0cda60f359c0b
|