为什么在 .sh 文件中使用 virtualenv 命令会给出 "command not found"?

Why does using virtualenv commands in .sh file give "command not found"?

我正在尝试在 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

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

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

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

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

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

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不再存在。