From 12cd3b3e399d39b2b458fdd8f1f6286250253476 Mon Sep 17 00:00:00 2001 From: Robert Crews Date: Sun, 3 Mar 2024 04:04:19 -0800 Subject: feat(python): add auto venv activation (#12248) Co-authored-by: Carlo Sala --- plugins/python/README.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'plugins/python/README.md') diff --git a/plugins/python/README.md b/plugins/python/README.md index 7bf1b34ac..c99697b22 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -22,8 +22,18 @@ plugins=(... python) ## Virtual environments -The plugin provides two utilities to manage Python venvs: +The plugin provides three utilities to manage Python 3.3+ [venv](https://docs.python.org/3/library/venv.html) +virtual environments: -- `mkv [name]`: make a new virtual environment called `name` (default: `venv`) in current directory. +- `mkv [name]`: make a new virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else + `venv`) in the current directory. -- `vrun [name]`: activate virtual environment called `name` (default: `venv`) in current directory. +- `vrun [name]`: Activate the virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else + `venv`) in the current directory. + +- `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing + `/bin/activate`, and automatically deactivate it when navigating out of it (including + subdirectories!). + - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. + - The default virtual environment name is `venv`. To use a different name, set + `export PYTHON_VENV_NAME=`. For example: `export PYTHON_VENV_NAME=".venv"` -- cgit v1.2.3-70-g09d2 From 22bbc233e90f18ad7a02625c66d1867a5486fcbb Mon Sep 17 00:00:00 2001 From: Michael Gonzo Date: Tue, 7 May 2024 21:30:23 +0200 Subject: feat(python): autovenv keeps activated on subdirs (#12396) Co-authored-by: Carlo Sala --- plugins/python/README.md | 7 ++++--- plugins/python/python.plugin.zsh | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) (limited to 'plugins/python/README.md') diff --git a/plugins/python/README.md b/plugins/python/README.md index c99697b22..b990a26b9 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -32,8 +32,9 @@ virtual environments: `venv`) in the current directory. - `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing - `/bin/activate`, and automatically deactivate it when navigating out of it (including - subdirectories!). + `/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated + in subdirectories). - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - - The default virtual environment name is `venv`. To use a different name, set + - Plugin activates first virtual environment in lexicographic order whose name begins with ``. + The default virtual environment name is `venv`. To use a different name, set `export PYTHON_VENV_NAME=`. For example: `export PYTHON_VENV_NAME=".venv"` diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index f6ea85027..7256aa04f 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -86,11 +86,20 @@ function mkv() { if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then # Automatically activate venv when changing dir - auto_vrun() { - if [[ -f "${PYTHON_VENV_NAME}/bin/activate" ]]; then - source "${PYTHON_VENV_NAME}/bin/activate" > /dev/null 2>&1 - else - (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 + function auto_vrun() { + # deactivate if we're on a different dir than VIRTUAL_ENV states + # we don't deactivate subdirectories! + if (( $+functions[deactivate] )) && [[ $PWD != ${VIRTUAL_ENV:h}* ]]; then + deactivate > /dev/null 2>&1 + fi + + if [[ $PWD != ${VIRTUAL_ENV:h} ]]; then + for _file in "${PYTHON_VENV_NAME}"*/bin/activate(N.); do + # make sure we're not in a venv already + (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 + source $_file > /dev/null 2>&1 + break + done fi } add-zsh-hook chpwd auto_vrun -- cgit v1.2.3-70-g09d2 From a84bc2dadd9c0925c2f88e66a1796746e63fa427 Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Sun, 15 Sep 2024 15:06:47 +0200 Subject: fix(python)!: remove harmful `ipython` alias (#12676) BREAKING CHANGE: the `ipython` alias was incorrectly trying to manually call ipython from the installed module in the virtual environment, when actually a command already exists when loading the virtual environment. This change removes the unnecessary alias and allows calling the right command. Fixes #12676 --- plugins/python/README.md | 1 - plugins/python/python.plugin.zsh | 3 --- 2 files changed, 4 deletions(-) (limited to 'plugins/python/README.md') diff --git a/plugins/python/README.md b/plugins/python/README.md index b990a26b9..8014992de 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -13,7 +13,6 @@ plugins=(... python) | Command | Description | | ---------------- | -------------------------------------------------------------------------------------- | | `py` | Runs `python3`. Only set if `py` is not installed. | -| `ipython` | Runs the appropriate `ipython` version according to the activated virtualenv | | `pyfind` | Finds .py files recursively in the current directory | | `pyclean [dirs]` | Deletes byte-code and cache files from a list of directories or the current one | | `pygrep ` | Looks for `text` in `*.py` files in the current directory, recursively | diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 811745257..63733e1de 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -43,9 +43,6 @@ function pyuserpaths() { # Grep among .py files alias pygrep='grep -nr --include="*.py"' -# Run proper IPython regarding current virtualenv (if any) -alias ipython='python3 -c "import sys; del sys.path[0]; import IPython; sys.exit(IPython.start_ipython())"' - # Share local directory as a HTTP server alias pyserver="python3 -m http.server" -- cgit v1.2.3-70-g09d2 From cca4043238421ae8e018720326d5357027f27cf8 Mon Sep 17 00:00:00 2001 From: Marc Cornellà Date: Thu, 23 Jan 2025 19:54:50 +0100 Subject: feat(python): support multiple venvs via `$PYTHON_VENV_NAMES` (#12932) --- plugins/python/README.md | 45 +++++++++++++++++++++++++++++++++------- plugins/python/python.plugin.zsh | 26 +++++++++++++++++++---- 2 files changed, 59 insertions(+), 12 deletions(-) (limited to 'plugins/python/README.md') diff --git a/plugins/python/README.md b/plugins/python/README.md index 8014992de..490cf88f1 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -24,16 +24,45 @@ plugins=(... python) The plugin provides three utilities to manage Python 3.3+ [venv](https://docs.python.org/3/library/venv.html) virtual environments: -- `mkv [name]`: make a new virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else - `venv`) in the current directory. +- `mkv [name]`: make a new virtual environment called `name` in the current directory. + **Default**: `$PYTHON_VENV_NAME` if set, otherwise `venv`. -- `vrun [name]`: Activate the virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else - `venv`) in the current directory. +- `vrun [name]`: activate the virtual environment called `name` in the current directory. + **Default**: the first existing in `$PYTHON_VENV_NAMES`. -- `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing +- `auto_vrun`: automatically activate the venv virtual environment when entering a directory containing `/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated in subdirectories). - - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - - Plugin activates first virtual environment in lexicographic order whose name begins with ``. + - To enable the feature, set `PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. + - The plugin activates the first existing virtual environment, in order, appearing in `$PYTON_VENV_NAMES`. The default virtual environment name is `venv`. To use a different name, set - `export PYTHON_VENV_NAME=`. For example: `export PYTHON_VENV_NAME=".venv"` + `PYTHON_VENV_NAME=`. For example: `PYTHON_VENV_NAME=".venv"` + +### Settings + +You can set these variables in your `.zshrc` file, before Oh My Zsh is sourced. +For example: + +```sh +PYTHON_VENV_NAME=".venv" +PYTHON_VENV_NAMES=($PYTHON_VENV_NAME venv) +... +plugins=(... python) +source "$ZSH/oh-my-zsh.sh" +``` + + +## `$PYTHON_VENV_NAME` + +**Default**: `venv`. + +Preferred name for virtual environments, for example when creating via `mkv`. + +## `$PYTHON_VENV_NAMES` + +**Default**: `$PYTHON_VENV_NAME venv .venv`. + +Array of virtual environment names to be checked, in order, by `vrun` and `auto_vrun`. +This means these functions will load the first existing virtual environment in this list. +Duplicate names are ignored. + diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 63733e1de..2b139ddf0 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -47,12 +47,29 @@ alias pygrep='grep -nr --include="*.py"' alias pyserver="python3 -m http.server" -## venv utilities +## venv settings : ${PYTHON_VENV_NAME:=venv} +# Array of possible virtual environment names to look for, in order +# -U for removing duplicates +typeset -gaU PYTHON_VENV_NAMES +[[ -n "$PYTHON_VENV_NAMES" ]] || PYTHON_VENV_NAMES=($PYTHON_VENV_NAME venv .venv) + # Activate a the python virtual environment specified. -# If none specified, use $PYTHON_VENV_NAME, else 'venv'. +# If none specified, use the first existing in $PYTHON_VENV_NAMES. function vrun() { + if [[ -z "$1" ]]; then + local name + for name in $PYTHON_VENV_NAMES; do + local venvpath="${name:P}" + if [[ -d "$venvpath" ]]; then + vrun "$name" + return $? + fi + done + echo >&2 "Error: no virtual environment found in current directory" + fi + local name="${1:-$PYTHON_VENV_NAME}" local venvpath="${name:P}" @@ -91,10 +108,11 @@ if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then fi if [[ $PWD != ${VIRTUAL_ENV:h} ]]; then - for _file in "${PYTHON_VENV_NAME}"*/bin/activate(N.); do + local file + for file in "${^PYTHON_VENV_NAMES[@]}"/bin/activate(N.); do # make sure we're not in a venv already (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 - source $_file > /dev/null 2>&1 + source $file > /dev/null 2>&1 break done fi -- cgit v1.2.3-70-g09d2 From 2ee4f9808ff50bf35f36b28657933afd6d80e268 Mon Sep 17 00:00:00 2001 From: Anand Buddhdev Date: Tue, 29 Apr 2025 10:34:33 +0200 Subject: docs(python): fix typo (#13096) --- plugins/python/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/python/README.md') diff --git a/plugins/python/README.md b/plugins/python/README.md index 490cf88f1..ca424ea55 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -34,7 +34,7 @@ virtual environments: `/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated in subdirectories). - To enable the feature, set `PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - - The plugin activates the first existing virtual environment, in order, appearing in `$PYTON_VENV_NAMES`. + - The plugin activates the first existing virtual environment, in order, appearing in `$PYTHON_VENV_NAMES`. The default virtual environment name is `venv`. To use a different name, set `PYTHON_VENV_NAME=`. For example: `PYTHON_VENV_NAME=".venv"` -- cgit v1.2.3-70-g09d2