为什么在 .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
不再存在。
我正在尝试在 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
不再存在。