如何创建Bash脚本来激活Python virtualenv?
我的目录结构如下:
.env
bin
activate
...other virtualenv files...
src
shell.sh
...my code...
我可以通过以下方式激活我的virtualenv:
user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$
但是,从Bash脚本执行相同操作无效:
user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$
我做错了什么?
答案 0 :(得分:55)
当您获取源代码时,您将激活脚本加载到活动shell中。
当您在脚本中执行此操作时,将其加载到该脚本中,该脚本在脚本完成时退出并返回到原始的未激活shell。
您最好的选择是在功能
中完成activate () {
. ../.env/bin/activate
}
或别名
alias activate=". ../.env/bin/activate"
希望这有帮助。
答案 1 :(得分:44)
您应该使用source调用bash脚本。
以下是一个例子:
#!/bin/bash
# Let's call this script venv.sh
source "<absolute_path_recommended_here>/.env/bin/activate"
在你的shell上就这样称呼它:
> source venv.sh
或者@outmind建议:(请注意,这不适用于zsh)
> . venv.sh
你去了,shell指示将放在你的提示上。
答案 2 :(得分:13)
虽然它没有在shell提示符中添加“(.env)”前缀,但我发现此脚本按预期工作。
#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"
e.g。
user@localhost:~/src$ which pip
/usr/local/bin/pip
user@localhost:~/src$ which python
/usr/bin/python
user@localhost:~/src$ ./shell
user@localhost:~/src$ which pip
~/.env/bin/pip
user@localhost:~/src$ which python
~/.env/bin/python
user@localhost:~/src$ exit
exit
答案 3 :(得分:8)
Sourcing在您当前的shell中运行shell命令。当您在上面执行脚本内部时,您正在影响该脚本的环境,但是当脚本退出时,环境更改将被撤消,因为它们已经有效地超出了范围。
如果您的目的是在virtualenv中运行shell命令,则可以在获取激活脚本后在脚本中执行此操作。如果您的目的是与virtualenv中的shell进行交互,那么您可以在脚本中生成一个继承环境的子shell。
答案 4 :(得分:1)
你也可以使用子shell来更好地包含你的用法 - 这是一个实际的例子:
#!/bin/bash
commandA --args
# Run commandB in a subshell and collect its output in $VAR
VAR=$(
PATH=$PATH:/opt/bin
. /path/to/activate > /dev/null
commandB # tool from /opt/bin that requires virtualenv
)
# Use the output of the commandB later
commandC "${VAR}"
这种风格在
时特别有用commandA
或commandB
存在于/opt/bin
中
答案 5 :(得分:0)
为bash脚本寻找什么?
如果您打算在多个virtualenv之间切换或快速输入一个virtualenv,您是否尝试过virtualenvwrapper
?它提供了许多工具,如workon venv
,mkvirtualenv venv
等。
如果您只是在某些virtualenv中运行python脚本,请使用/path/to/venv/bin/python script.py
来运行它。
答案 6 :(得分:0)
这是我经常使用的脚本
#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
. $PWD/venv/bin/activate
}
activate
答案 7 :(得分:0)
您应该在一行中使用多个命令。例如:
os.system(". Projects/virenv/bin/activate && python Projects/virenv/django-project/manage.py runserver")
在一行中激活虚拟环境时,我认为它会忘记其他命令行,因此可以通过在一行中使用多个命令来防止这种情况。 它对我有用:)
答案 8 :(得分:0)
在学习venv时,我创建了一个脚本来提醒我如何激活它。
#!/bin/sh
# init_venv.sh
if [ -d "./bin" ];then
echo "[info] Ctrl+d to deactivate"
bash -c ". bin/activate; exec /usr/bin/env bash --rcfile <(echo 'PS1=\"(venv)\${PS1}\"') -i"
fi
这具有更改提示的优点。