How to display the name of the current Virtualenv?

67,843

Solution 1

Shell's prompt

Inside your virtualenv environment is a file, bin/activate. You can edit this file to change your prompt to whatever you want it to look like. Specifically this section of the file:

...
else
    PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
...

The variable PS1 is a special variable that controls what a shell's prompt will look like. Changing its value will change your virtualenv prompt:

PS1="(this is my prompt) "

Example

  1. Create a sample environment.

    $ virtualenv tst-env
    
  2. When you're using virtualenv you typically source this file.

    $ cd $HOME/tst-env
    
    $ source bin/activate
    (tst-env)[saml@grinchy tst-env]$ 
    
  3. After making the above change to the variable PS1 in the bin/activate file my prompt is now this:

    $ source bin/activate
    (tst-env)
    

Here are the official instructions on how to do this.

Solution 2

If you're using virtualenvwrapper and zsh there are a number of zsh hooks in your ~/.virtualenvs/ directory that you can use to customize your environments. Here is a bit of info regarding these. You can force an update to PS1 that will prepend the current working virtualenv to your shell prompt by adding:

_OLD_VIRTUAL_PS1=$PS1
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
builtin \export PS1

to ~/.virtualenvs/postactivate. To remove the tag when you deactivate, add:

PS1=$_OLD_VIRTUAL_PS1
builtin export PS1

to ~/.virtualenvs/postdeactivate

The only (plausible) thing that should break this is resourcing ~/.zshrc while working in a virtualenv

Solution 3

You don't have to edit your ~/.zshrc.

Since you are working with virtualenvwrapper it's possible to add options or hooks to $WORKON_HOME/post(de)activate files.

If you want to see more details consult here.

The above link allow me to do next:

In my case $WORKON_HOME=~/Envs because I modified this path when I installed virtualenvwrapper; if you didn't you should have the folder ~/.virtualenvs.

  1. Open the file postactivate located in $WORKON_HOME

  2. Add these lines:

    PS1="$_OLD_VIRTUAL_PS1"
    _OLD_RPROMPT="$RPROMPT"
    RPROMPT="%{${fg_bold[white]}%}(env: %{${fg[green]}%}`basename \"$VIRTUAL_ENV\"`%{${fg_bold[white]}%})%{${reset_color}%} $RPROMPT"
    
  3. Save and enjoy!

    You will obtain something like this: done

  4. (OPTIONAL) If you want you could edit the postdeactivate file to add this line:

    RPROMPT="$_OLD_RPROMPT"
    

Solution 4

[While this answer arguably strays a bit from answering the question as asked (though I attempt to at least partially do that, as well), I found my way to this question when looking for an answer that I knew existed for venv (instead of virtualenv), that I couldn't remember the exact details of (namely, the --prompt option, which both commands support). I suspect I won't be the first, so here goes.]


with virtualenv / main answer:

First off, the basic answer to your core question is that you shouldn't need to do anything to get a prompt change, except to have an environment created, run its activate source file (which workon should effectively do for you), and have otherwise followed the installation docs (more below) — e.g. an extract from the virtualenv docs:

$ workon
$ mkvirtualenv mynewenv
New python executable in mynewenv/bin/python
Installing setuptools.............................................
..................................................................
..................................................................
done.
(mynewenv)$

This sort of behavior is what I'd expect from typing workon example, as you do in the question text, above (except you'd then get a prompt of (example)$ instead of (mynewenv)$).

If you're not getting that, I'd make sure you're following all the proper steps for setting up virtualenv. It's relatively unlikely you'd need to change anything in your .zshrc [side note: your link to that is dead now] — except as per the original installation instructions, which suggest adding the following (or a lazy-loading alternative, also listed there):

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Devel
source /usr/local/bin/virtualenvwrapper.sh

And there should be nothing else... unless you're wanting the name to show up in a different place in your prompt or something (in which case, you may find some of the answers to this question useful).

That said, there's also a question of simply naming the environment, which can be done either by naming the folder that stores the env, e.g.:

virtualenv example

Or by specifying a prompt when creating the environment with a different name, e.g.:

virtualenv env --prompt example

(This latter would create the files in a directory called ./env, but the prompt when activating it would start with (example).)

with venv:

In modern (as I write this) python environments, it's also fairly common to just use the ships-with-python venv instead of (the pip-installed) virtualenv (though virtualenv still has adherents and reasons to use it — if I understand things correctly, venv is basically just a stripped-down version of virtualenv, with the latter having additional features and other improvements, not found in venv), and with venv, the equivalent of those last two commands (above) would be either:

python3 -m venv example

... or...

python3 -m venv env --prompt example

... respectively.

I hope this is useful (to someone)!

Solution 5

If you know the theme that is being used, you can add a function to retrieve the activated VIRTUAL_ENV base name and use it in the PROMPT variable in the *.zsh-theme file located at ~/.oh-my-zsh/themes/ and that should do the trick!

For me it was the default 'oh-my-zsh' theme i.e. 'robbyrussels' which was configured.

function virtualenv_info {
    [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
}

local ret_status="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
PROMPT='${ret_status} $(virtualenv_info) %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'

Adding the above code generated the below result:

enter image description here

(kunkka.com) is the virtualenv which I just deactivated.

After editing the theme file don't forget to source the .zshrc file.

-> source ~/.zshrc
Share:
67,843

Related videos on Youtube

mahieddine
Author by

mahieddine

Updated on September 18, 2022

Comments

  • mahieddine
    mahieddine over 1 year

    I'm using virtualenv, virtualenvwrapper, zsh, oh-my-zsh, terminator, on Crunchbang.

    I'm trying to display the name of the current virtualenv like so

    workon example
    (example)... 
    

    I've tried many solutions none seems to work, here's my .zshrc file, I know it's no big deal to fix it but I can't find the right solution. It has been a long time since the last time I used Linux for Django development, I forgot what I used to do.

    Right now, I see username@crunchbang, I can't tell which virtualenv I'm using.

  • mahieddine
    mahieddine over 10 years
    tried it now, didn't fix it
  • mahieddine
    mahieddine over 10 years
    here's my activate file pastebin.com/tZqdr1Yz
  • slm
    slm over 10 years
    What happens when you source the activate file? Your file worked fine for me.
  • mahieddine
    mahieddine over 10 years
    i see no output, so i can't tell what happens, the virtualenv is working other than that i see nothing, maybe it's .zshrc issue or virtualenvwrapper? can this issue be debugged? please note i have 2 virualenv executable files, the normal virtualenv and virtualenv-2.7 is this normal or did virtualenv got downloaded twice? and this is how i installed virtualenv and virualenvwrapper in case it matters sudo pip install virtualenv
  • slm
    slm over 10 years
    @Fischer - I just double checked it using zsh and it works with that too, so this is most likely an env. issue. Let's ignore the 2 virtualenv's setups for the time being. To debug you can enable it, set -x, in your shell and then re-run the source activate command again. You should see PS1= lines where the prompt is getting set.
  • mahieddine
    mahieddine over 10 years
    Sorry for the late reply sir,I used set -x, this is the output of source activate and this is the output of workon test-env
  • slm
    slm over 10 years
    Does the prompt change when you run this command? export PS1='(test-env)'
  • slm
    slm over 10 years
    You're using virtualenvwrapper which is different than virtualenv BTW. I believe it calls virtualenv which is probably part of the problem. I believe there are similar changes that you need to make in this file: $WORKON_HOME/postactivate which is a virtualenvwrapper file, not part of virtualenv. LMK if you have it.
  • mahieddine
    mahieddine over 10 years
    the prompt doesn't change after i runexport PS1='(test-env)' ... And postactivate i have 2 of these files, the first, is in the virtualenv project folder, the second is in test-env/bin they all contain the following lines #!/bin/zsh # This hook is run after this virtualenv is activated
  • mahieddine
    mahieddine over 10 years
    so they are practically empty, nothing other than the comments
  • mahieddine
    mahieddine over 10 years
    tried that now, bash works fine, i can see the (test-env) and if i run export PS1='(test-env) the username@crunchbang will disapear, i'll see > where i enter commands and i press ctrl-c to exit
  • mahieddine
    mahieddine over 10 years
    it maybe a zsh problem, if it cant be fixed i'll use bash
  • mahieddine
    mahieddine over 10 years
    this is the output pastebin.com/MSQkfH4E
  • slm
    slm over 10 years
    @Fischer - it's interesting that your env output doesn't include PS1=.... Can you try setting the RPROMPT=... variable like so: export RPROMPT='(test-env) ?
  • mahieddine
    mahieddine over 10 years
    when i do export RPROMPT='(test-env)' the test-env shows up, like so i.imgur.com/cx0q6b2.png but it doesn't matter if i'm using the virtualenv or not, it still shows until i exit the shell, when i start a new shell it will disapear
  • slm
    slm over 10 years
    @Fischer - how about if you do this: export PROMPT='(test-env) '?
  • mahieddine
    mahieddine over 10 years
    Oh, i didn't recognize that you wrote export RPROMPT='(test-env) on purpose, i thought you were missing a single quote :) so to recap: export RPROMPT='(test-env)' the test-env` shows up as i said in my previous comment, export PROMPT='(test-env) ' does nothing, workon test-env shows nothing at all, but export PROMPT='(test-env) shows quote> and i have to press ctrl-c to exit
  • slm
    slm over 10 years
    @Fischer - that was a mistake on my part. So PROMPT didn't work out either?
  • mahieddine
    mahieddine over 10 years
    no sir, it didn't, why bash is so different to zsh when it comes to virtualenv by the way?
  • slm
    slm over 10 years
    @Fischer - are you using a prompt theme? askubuntu.com/questions/90254/cannot-change-zsh-prompt
  • mahieddine
    mahieddine over 10 years
    no i'm not, should i try changing the theme? I'm using the default theme right now
  • slm
    slm over 10 years
    @Fischer - don't know much about these prompt themes. Looking at that thread I would assume that using them in any capacity is a problem if you want to change the prompt.
  • mahieddine
    mahieddine over 10 years
    i got it working, removed everything and added the following pastebin.com/kYreLrsy and it's working (don't know why, don't ask me :) ) but i noticed that i cant change themes, so it might have something to do with themes!I'll grab a configuration from here stackoverflow.com/questions/171563/whats-in-your-zshrc and i'll see what to do... this issue is apparently solved, now I'll have to see what is the connection between this issue and the themes (although i don't care about themes, not a designer :P) but i want to see why it caused me so much troubles!
  • Greg Hilston
    Greg Hilston over 7 years
    I believe you're postdeactivate script has a mistake. it should read PS1=$_OLD_VIRTUAL_PS1 builtin \export PS1
  • Tom Hale
    Tom Hale over 6 years
    This seems to be copied from the official documentation
  • Erikw
    Erikw over 4 years
    virtualenvwrapper already does this by default now. In venv created by virtualenvwrapper, the bin/activate script contains code to pre-pend the venv name to both zsh and bash prompts!
  • Scott - Слава Україні
    Scott - Слава Україні over 3 years
    It looks like you are implicitly saying that the accepted answer is wrong.  Why are you telling the OP to switch away from that answer?  And what does ${PS1-} mean?
  • Vignesh Sk
    Vignesh Sk over 3 years
    I am not saying it is wrong. I am adding an improvement. With the accepted answer.. I lost my current directory info from the terminal. I was not able to edit the original comment so i added my suggestion as an asnwer And ${PS1-} is what i had in my activate file. I just copy pasted the same.
  • Scott - Слава Україні
    Scott - Слава Україні over 3 years
    Well, it looks like you are saying “Get rid of the `basename \"$VIRTUAL_ENV\"` part.
  • Vignesh Sk
    Vignesh Sk over 3 years
    Yes.. we need to keep the suffix to save the pwd information in our terminal.. the suffix can be ${PS1-} or just $PS1 depending on the file