-
Notifications
You must be signed in to change notification settings - Fork 793
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature Request: uv shell
#1910
Comments
This is somewhat similar to the Also, a functionality that I find useful of virtualenvwrapper are the hooks (pre/post hooks on venv activation and venv creation) If you can include some of these features in |
I frequently use |
Would like to have an even shorter alias at the same time such as Fwiw, this is what I have for my Bash shell on both Windows (git-bash) and Linux right now. Bash ScriptYou can add this into your uvsh() {
local venv_name=${1:-'.venv'}
venv_name=${venv_name//\//} # remove trailing slashes (Linux)
venv_name=${venv_name//\\/} # remove trailing slashes (Windows)
local venv_bin=
if [[ -d ${WINDIR} ]]; then
venv_bin='Scripts/activate'
else
venv_bin='bin/activate'
fi
local activator="${venv_name}/${venv_bin}"
echo "[INFO] Activate Python venv: ${venv_name} (via ${activator})"
if [[ ! -f ${activator} ]]; then
echo "[ERROR] Python venv not found: ${venv_name}"
return
fi
# shellcheck disable=SC1090
. "${activator}"
} Usage
|
I had this in rye and backed it out because there is just no non hacky way to make this work. I think the desire is real, but the experience just will always have holes. You basically need to allocate a pty, hook it up with the parent pty and then send key presses into it to manipulate the shell environment. It's pretty hacky and breaks stuff in subtle ways :( |
Is it not just a case of exec'ing |
For work I'm switching between Windows and Linux a lot. Having one command for activating would be nice to have, so I don't have to deal with |
Here's the script that I am currently using as a stand-in for Quick demo of it in operation:
|
What about if, instead of hooking up pty's, we just do the bare minimum? We detect the shell (whether zsh, bash, nushell or powershell), the OS, and just call the source file. Although I'm afraid @mitsuhiko thought of this and decided not to do it, so perhaps it just isn't feasible. |
Unfortunately you can't |
I think there are two separate feature requests that are being combined in this issue:
I think the talk of injecting keypresses into a shell via a pty is about the second item, whereas the original request in this issue was about the first. My preference is for the first, as it is straightforward to 'exit' the spawned shell without exiting the terminal emulator/window, whereas if the current shell is modified then it is not easy to 'unmodify' it. |
I think the first option somewhat reflects what pixi does, https://github.com/prefix-dev/pixi/blob/main/src/cli/shell.rs I gave their impl a quick whirl on uv to test, and seems to works pretty well |
FWIW I've always considered So for my team I prefer to recommend always using |
What about providing a wrapper shell script to do the sourcing part? Just like We have two options:
|
I don't know if this is relevant here, but sometimes I have difficulties understanding which venv I'm actually using and what's happening under the hood (and why). I'm not sure if there's already a way to figure out these things and I'm just missing it. Consider this scenario: I have a project in VSCode without a venv. I open the terminal and run
This output reflects my clean, system environment. Next, I run
So, I'm expecting Now, if I close VSCode and reopen it, VSCode continues with its "implicit" activation of If, for some reason, I now delete
While I expected the same output (the system environment) as before. I think it's VSCode's fault because I guess it somehow implicitly runs something like So my point is: it would be nice to have some mechanism inside of |
Just a kind reminder of the existence of https://github.com/direnv/direnv. It would be actually nice to learn from it and explore integration with it ? |
I wrote a simple function for the Fish shell: https://github.com/zefr0x/dotfiles/blob/f3f20a4ab91c198674211c76ad431ef8260cfe10/utils/fish/functions/vf.fish It does store all venvs in a global dir, and provides some commands to manage them. It address the problem for my workflow, and can be used as a reference to implement a general solution that gets packaged with |
I think it's worth looking at this from the lense of what the world might look like in two years. A lot of the reasons people want to "activate" virtualenvs is that this is how we used to do things, not necessarily how we would do things in a slightly changed world. Even with rye today the need to actually activate a virtualenv is largely gone as the python executable always does the right thing, and npm got away without any equivalent of "activation" and I think a future Python ecosystem will also no longer find much use in virtualenv activation. |
I just threw this in my
this mimics the same Albeit feeling the need for a quicker way to activate the env while using uv I agree with the sentiment that it's not the called process role to alter the parent's environment. |
It's tricky enough that other projects like See the green note here: Looking for |
There is a thread about integration that might go official sometime, see direnv/direnv#1250. |
|
And it would be great if function activate
set --function cwd (pwd)
set --function home (dirname (realpath $HOME))
set --function venv_path ""
# Recursive search upward for .venv directory
while test -n $cwd -a $home != $cwd
if test -e $cwd/.venv
set --function venv_path (realpath $cwd/.venv)
break
end
set --function cwd (dirname $cwd)
end
if test -n $venv_path
if test -d $venv_path
source $venv_path/bin/activate.fish
else
echo "Found .venv at $venv_path, but it is not a valid directory"
end
else
echo "Could not find .venv directory"
end
end |
Instead of activating the environment, I personally find it helpful instead to
|
I'll be honest, I originally saw the lack of a 'shell' command as a deal-breaker since I am so used to Poetry. When I stepped back for a sec I realise I can get by with a couple of shell aliases (Linux or Mac): # uv aliases
alias va='source .venv/bin/activate'
alias vd='deactivate' This is from my Now, I just enter my project folder and type I've got my GitHub actions working again, and changed to EDIT: |
(Grabs 🍿) I like Although I like very much using |
What I do to get around this for now, is use the plugins=(... python)
export PYTHON_VENV_NAME=".venv"
export PYTHON_AUTO_VRUN=true |
OMG, I really need to RTFM more often, i've been using omz for years 🤣 - that works just prefectly and utterly transparent 👍 Doesn't seem to interfere with folders where i'm using the |
I've had this in my export DEFAULT_PYTHON_VENV_DIR=.venv
function _py_venv_activation_hook() {
local ret=$?
if [ -n "$VIRTUAL_ENV" ]; then
source $DEFAULT_PYTHON_VENV_DIR/bin/activate 2>/dev/null || deactivate || true
else
source $DEFAULT_PYTHON_VENV_DIR/bin/activate 2>/dev/null || true
fi
return $ret
}
typeset -g -a precmd_functions
if [[ -z $precmd_functions[(r)_py_venv_activation_hook] ]]; then
precmd_functions=(_py_venv_activation_hook $precmd_functions);
fi |
Just wanted to leave my two cents, as I see this is a more complicated issue than I first thought (started learning uv, missed fish has a flag to run a command before starting interactivity ( function uvenv
fish -C "source .venv/bin/activate.fish"
end |
Poetry's |
Not sure why they did this, the |
Note that |
The issues with python-poetry/poetry#9136 |
It's been mentioned before, but seriously, wouldn't an implementation similar to pdm's be a good compromise here? |
Writing from windows, I have just tried |
Well, the request was about activating the environment, thus modifying the shell process the user was already in. |
That's the thing: this issue is about mimicking |
I see, I am unfamiliar with poetry and was only following OP's "Proposed Solution" bit. I am personally not a fan of spawning a new shell just in order to have the environment automatically activated, at that point I can setup a quick, unobtrusive way to activate the shell and use that in plave of |
FYI, you don't need to activate environments anymore. |
I think easy virtual environment activation is great to have. IMO uv has not made it obsolete, uv has based all its functionality on virtual environments, so they continue to be relevant. Virtual environment activation needs shell integration. I understand if
|
venvs made by uv have the activation scripts, so |
After realising that
This sounds nice on paper (cross platform command!) but it's not actually cross platform. On Windows you would need to |
Also, quitting the |
@luxedo that is exactly what everybody else is doing. You don't spawn the shell, you pexpect into a shell with all the complexities and bugs that this causes. There is no way to do this with shells today without having to remote control it and send key presses into it. I really believe the best one can achieve here is that someone runs |
Summary
I propose the introduction of a new command,
uv shell
. This command would provide users with a quick and straightforward way to enter the associated Python virtual environment (venv) for their projects.Motivation
The inspiration for
uv shell
comes from the convenience and simplicity offered by thepoetry shell
command in Poetry. Having worked with poetry on multiple OSs over the last year, I miss this intuitive approach to environment management. I propose introducing a similar capability into uv.Proposed Solution
The
uv shell
command would activate the project's Python virtual environment (basically a shorthand for.venv/bin/activate
), allowing users to immediately start working within the context of that environment OR return an error message if the venv is missing. This feature would abstract away the need to manually source the venv activation script, thus providing a more seamless development workflow across operating systems.The text was updated successfully, but these errors were encountered: