如何在Bash脚本中激活virtualenv激活

时间:2012-10-29 12:57:31

标签: python bash virtualenv

如何创建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$ 

我做错了什么?

9 个答案:

答案 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}"

这种风格在

时特别有用
    {li> commandAcommandB存在于/opt/bin
  • 这些命令在virtualenv
  • 下失败
  • 你需要各种不同的艺术家

答案 5 :(得分:0)

为bash脚本寻找什么?

  1. 如果您打算在多个virtualenv之间切换或快速输入一个virtualenv,您是否尝试过virtualenvwrapper?它提供了许多工具,如workon venvmkvirtualenv venv等。

  2. 如果您只是在某些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

这具有更改提示的优点。