python virtualenv activate文件分析

来源:互联网 发布:three.js 全景图切换 编辑:程序博客网 时间:2024/06/09 21:14

使用virtualenv创建了一个虚拟环境后,需要先执行source activate才能够激活此虚拟环境,其实activate是一个shell脚本文件,本文将对此文件进行分析,以让读者明白此脚本的功能。

本文将以我的一个activate文件为例,进行解析。
我的activate文件如下:

# This file must be used with "source bin/activate" *from bash*                                                          # you cannot run it directly                                                                                             deactivate () {                                                                                                              unset -f pydoc >/dev/null 2>&1                                                                                           # reset old environment variables                                                                                        # ! [ -z ${VAR+_} ] returns true if VAR is declared at all                                                               if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then                                                                                  PATH="$_OLD_VIRTUAL_PATH"                                                                                                export PATH                                                                                                              unset _OLD_VIRTUAL_PATH                                                                                              fi                                                                                                                       if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then                                                                            PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"                                                                                    export PYTHONHOME                                                                                                        unset _OLD_VIRTUAL_PYTHONHOME                                                                                        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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then                                                                      hash -r 2>/dev/null                                                                                                  fi                                                                                                                       if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then                                                                                   PS1="$_OLD_VIRTUAL_PS1"                                                                                                  export PS1                                                                                                               unset _OLD_VIRTUAL_PS1                                                                                               fi                                                                                                                       unset VIRTUAL_ENV                                                                                                        if [ ! "${1-}" = "nondestructive" ] ; then                                                                               # Self destruct!                                                                                                             unset -f deactivate                                                                                                  fi      }                                                                                                                        # unset irrelevant variables                                                                                             deactivate nondestructive                                                                                                VIRTUAL_ENV="/home/dk/test/venv"                                                                                         export VIRTUAL_ENV                                                                                                       _OLD_VIRTUAL_PATH="$PATH"                                                                                                PATH="$VIRTUAL_ENV/bin:$PATH"                                                                                            export PATH                                                                                                              # unset PYTHONHOME if set                                                                                                if ! [ -z "${PYTHONHOME+_}" ] ; then                                                                                         _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"         unset PYTHONHOME                                                                                                     fi                                                                                                                       if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then                                                                            _OLD_VIRTUAL_PS1="$PS1"                                                                                                  if [ "x" != x ] ; then                                                                                                       PS1="$PS1"                                                                                                           else                                                                                                                         PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"                                                                             fi                                                                                                                       export PS1     fi                                                                                                                       # Make sure to unalias pydoc if it's already there                                                                       alias pydoc 2>/dev/null >/dev/null && unalias pydoc                                                                      pydoc () {                                                                                                                   python -m pydoc "$@"                                                                                                 }                                                                                                                        # 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-}" ] || [ -n "${ZSH_VERSION-}" ] ; then                                                                      hash -r 2>/dev/null                                                                                                  fi 

关键点:
1. 创建VIRTUAL_ENV环境变量,此环境变量执行虚拟环境,然后将此环境变量插入到PATH环境变量之前,这就保证每次优先到此处来执行python。
2. 此处仅仅调整了PATH环境变量,然后我使用sys.path查看了一些激化了虚拟环境后的path环境变量,发现了一些我比较疑惑的地方:
这里写图片描述
显然,它自动将venv目录下的lib目录添加到sys.path中,对比,env目录输出的激活python虚拟环境后的环境变量path:
这里写图片描述
则会发现,其实python的sys.path 和系统的path环境变量的值是不相同的。
这就引出了一个问题,python是如何根据系统环境变量path来构建自己的sys.path变量的呢??