为什么在.sh文件中使用virtualenv命令会给出"命令找不到"?

时间:2015-01-28 10:46:46

标签: macos bash sh

我正在尝试在Mac(Mavericks)上自动删除和重新创建virtualenv。

我有一个文件clean_venv.sh

#!/bin/bash
echo "Start"
deactivate
rmvirtualenv test
mkvirtualenv test

这给出了:

Start
./clean_venv.sh: line 3: deactivate: command not found
./clean_venv.sh: line 4: rmvirtualenv: command not found
./clean_venv.sh: line 5: mkvirtualenv: command not found

但是,在同一位置运行命令可以正常工作。为什么是这样?

2 个答案:

答案 0 :(得分:0)

虚拟环境是当前shell进程的一项功能。启动新的shell进程(如运行shell脚本)会创建一个不继承虚拟环境的新进程。

鉴于此,您实际上不需要deactivate。一旦确定它们位于PATH中,或者如果它们是函数,则可以从虚拟环境的启动文件中导入其他命令。

或者,在当前shell中定义一个函数,然后使用它。

clean_venv () {
    echo "Useless noise here."
    deactivate
    rmvirtualenv test
    mkvirtualenv test
}

答案 1 :(得分:0)

this question启发我发现此代码有效:

#!/bin/bash
source `which virtualenvwrapper.sh`
mkvirtualenv temp    # This makes sure I'm not on the test virtualenv,      
workon temp          # otherwise I can't delete it. deactivate doesn't
                     # work for some reason
rmvirtualenv test
mkvirtualenv test
workon test
rmvirtualenv temp
pip install -r requirements.txt; 

这感觉很酷,但它达到了预期的效果。更新requirements.txt后,一个命令可以从头开始重新创建virtualenv。最后,我有一个虚拟环境(test)和temp不再存在。