Can I automatically change my PYTHONPATH when activating/deactivating a virtualenv?

后端 未结 2 1841
一个人的身影
一个人的身影 2021-02-02 17:19

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/act

相关标签:
2条回答
  • 2021-02-02 17:51

    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
    
    0 讨论(0)
  • 2021-02-02 17:52

    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!

    0 讨论(0)
提交回复
热议问题