2013-03-16 58 views
15

bash函数应该如何测试它是否在Python virtualenv中运行?shell函数如何知道它是否在virtualenv中运行?

浮现在脑海中的两种方法是:

[[ "$(type -t deactivate)" != function ]]; INVENV=$? 

[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$? 

(注:想$INVENV为1,如果我们是一个的virtualenv内,否则为0,是什么强制上面的向后看的测试。)

是否有什么少hacky?

+0

还有'command -v',一个内置的shell。 – phk 2016-10-22 17:27:52

回答

12

其实,我只是发现了类似的问题,从中可以很容易地得到一个答案之一:

Python: Determine if running inside virtualenv

例如,shell脚本可以使用类似

python -c 'import sys; print (sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0 

(感谢Christian龙为展示如何使Python 3也有这个解决方案的工作。)

编辑:这里有一个更直接的(因此更清晰和更清洁的)解决方案(从JuanPablo的评论采取了线索) :

INVENV=$(python -c 'import sys; print ("1" if hasattr(sys, "real_prefix") else "0")') 
+1

用于检查的可选命令:'python -c'import sys;打印hasattr(sys,“real_prefix”)'' – JuanPablo 2014-02-14 15:10:46

+2

添加括号以支持Python 3'python -c'import sys; print(sys.real_prefix)'2>/dev/null && INVENV = 1 || INVENV = 0' – 2015-06-15 15:40:20

16
if [[ "$VIRTUAL_ENV" != "" ]] 
then 
    INVENV=1 
else 
    INVENV=0 
fi 
// or shorter if you like: 
[[ "$VIRTUAL_ENV" == "" ]]; INVENV=$? 

EDIT:如@ThiefMaster提到评价,在一定条件下(例如,开始一个新的壳时 - 也许在tmuxscreen - 从活动的virtualenv内)该检查可能会失败(但是,从virtualenv启动新的shell也可能会导致其他问题,我不会推荐它)。

+0

我避免了这种方法,因为我已经设置了'$ VIRTUAL_ENV'的情况,但是(出于某种原因),而不是'$ PATH' ... – kjo 2013-03-16 20:37:27

+0

不确定'$ PATH'与它有什么关系?或者你的意思是你想检查你的当前工作目录是否是virtualenv的一部分? – robertklep 2013-03-16 20:39:54

+0

对于我令人困惑的评论感到抱歉;如果'$ VIRTUAL_ENV'不在'$ PATH'中,则所有其他使用的'python'可执行文件将不会是virtualenv中的一个。本身,赋值给'$ VIRTUAL_ENV'什么都不做。 – kjo 2013-03-16 21:06:33

1

如果您使用virtualenvwrappers,那么可以运行可以为您设置INVENV的前/后脚本。

或者我做什么,把你的你的.bashrc以下,并做好你的工作目录(Django的)呼吁.venv文件,以便在虚拟ENV会自动加载当你用cd命令进入目录

export PREVPWD=`pwd` 
export PREVENV_PATH= 

handle_virtualenv(){ 
    if [ "$PWD" != "$PREVPWD" ]; then 
     PREVPWD="$PWD"; 
     if [ -n "$PREVENV_PATH" ]; then 
      if [ "`echo "$PWD" | grep -c $PREVENV_PATH`" = "0" ]; then 
       deactivate 
       unalias python 2> /dev/null 
       PREVENV_PATH= 
      fi 
     fi 

     # activate virtualenv dynamically 
     if [ -e "$PWD/.venv" ] && [ "$PWD" != "$PREVENV_PATH" ]; then 
      PREVENV_PATH="$PWD" 
      workon `basename $PWD` 
      if [ -e "manage.py" ]; then 
       alias python='python manage.py shell_plus' 
      fi 
     fi 
    fi 
} 

export PROMPT_COMMAND=handle_virtualenv 
+0

感谢您的代码。顺便说一句,我认为bash已经保存了'OLDPWD',它和你的代码中的'PREVPWD'一样。 – kjo 2013-03-16 21:12:24

相关问题