views:

1098

answers:

2

I would like to have a different PYTHONPATH from my usual in a particular virtualenv. How do I set this up automatically? I realize that it's possible to hack the bin/activate file, is there a better/more standard way?

+1  A: 

Here is the hacked version of bin/activate for reference. It sets the PYTHONPATH correctly, but unsetting does not work.


# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {
    if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
        PATH="$_OLD_VIRTUAL_PATH"
        export PATH
        unset _OLD_VIRTUAL_PATH
    fi  

    # This should detect bash and zsh, which have a hash command that must
    # be called to get it to forget past commands.  Without forgetting
    # past commands the $PATH changes we made may not be respected
    if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
        hash -r
    fi  

    if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
        PS1="$_OLD_VIRTUAL_PS1"
        export PS1 
        unset _OLD_VIRTUAL_PS1
    fi  

    if [ -n "$_OLD_PYTHONPATH" ] ; then
        PYTHONPATH="$_OLD_PYTHONPATH"
        export PYTHONPATH 
        unset _OLD_PYTHONPATH
    fi  

    unset VIRTUAL_ENV
    if [ ! "$1" = "nondestructive" ] ; then
    # Self destruct!
        unset deactivate
    fi  
}

# unset irrelavent variables
deactivate nondestructive
VIRTUAL_ENV="env_location" # Anonymized
export VIRTUAL_ENV

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

_OLD_VIRTUAL_PS1="$PS1"
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
    # special case for Aspen magic directories
    # see http://www.zetadev.com/software/aspen/
    PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
else
    PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
export PS1

# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands.  Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
    hash -r
fi

_OLD_PYTHONPATH="$PYTHONPATH"
PYTHONPATH="new_pythonpath" #Anonymized
export PYTHONPATH
saffsd
+4  A: 

Hello!

This django-users post is probably going to help you a lot. It suggests using virtualenvwrapper to wrap virtualenv, to use the add2virtualenv command. Using this, when the environment is active, you can just call:

add2virtualenv directory1 directory2 ...

to add the directories to your pythonpath for the current environment.

It handles autonomously the PATH changes on environment switches. No black magic required. Et voila!

NicDumZ
I'm trying this out now, and I'll probably accept it in a couple of days if there still aren't any other solutions that do not depend on additional packages.
saffsd