在我当前的 bash 中激活 virtualenv(无子进程)

Activate virtualenv INSIDE the my current bash (no subprocess)

I want to have a generic BASH script witch activates my virtual environment inside a given folder.

我不能 运行 我原来的 BASH 里面的激活只能作为一个子进程(见 --rcfile)。只是 source-ing 它不起作用!

这是我当前的脚本:

#!/bin/bash -e

# BASH script to run virtual environment

# Show errors
set -x

DIR_CURRENT="$PWD"
DIR_VIRTUAL_ENV="$PWD/venv"
FILE_PYTHON="/usr/bin/python2.7"
FILE_REQUIREMENTS="requirements.txt"
FILE_VIRTUAL_ACTIVATE_BASH="$DIR_VIRTUAL_ENV/bin/activate"

# CD to current folder
cd ${DIR_CURRENT}

echo DIR: $(pwd)

# Create the virtual environment if not existing
if [ ! -d ${DIR_VIRTUAL_ENV} ]; then
    virtualenv -p ${FILE_PYTHON} ${DIR_VIRTUAL_ENV}
    chmod a+x ${FILE_VIRTUAL_ACTIVATE_BASH}
    source ${FILE_VIRTUAL_ACTIVATE_BASH}
    pip install -r ${FILE_REQUIREMENTS}
fi

/bin/bash --rcfile "$FILE_VIRTUAL_ACTIVATE_BASH"

# Disable errors
set +x

我使用 Mac OSX 10.10.5 和 Python 2.7.

遗憾的是,现有 1, 2, 3 个问题无法回答我的问题。

首先,您正在尝试做的事情已经被一个名为 virtualenvwrapper 的项目很好地解决了。


关于您的问题:使用函数而不是脚本。例如,将其放入您的 bashrc 中:

function enter_venv(){

    # BASH script to run virtual environment

    # Show errors
    set -x

    DIR_CURRENT="$PWD"
    DIR_VIRTUAL_ENV="$PWD/venv"
    FILE_PYTHON="/usr/bin/python2.7"
    FILE_REQUIREMENTS="requirements.txt"
    FILE_VIRTUAL_ACTIVATE_BASH="$DIR_VIRTUAL_ENV/bin/activate"

    # CD to current folder
    cd ${DIR_CURRENT}

    echo DIR: $(pwd)

    # Create the virtual environment if not existing
    if [ ! -d ${DIR_VIRTUAL_ENV} ]; then
        virtualenv -p ${FILE_PYTHON} ${DIR_VIRTUAL_ENV}
        chmod a+x ${FILE_VIRTUAL_ACTIVATE_BASH}
        source ${FILE_VIRTUAL_ACTIVATE_BASH}
        pip install -r ${FILE_REQUIREMENTS}
    fi

    /bin/bash --rcfile "$FILE_VIRTUAL_ACTIVATE_BASH"

    # Disable errors
    set +x
}

你可以这样称呼它:

enter_venv