install virtual env and some packages with an script

Viewed 84

I want to install virtual env in a specified directory and install some packages inside that with a Python script.

It's my script but it can't activate the virtual env, it say that the package is already install globally.

this script is just for testing and it should be incomplete.

import os
import sys
requierments = ['xerox', 'sqlparse']

dest, env_name = sys.argv[1], sys.argv[2]

if dest == './':
    os.system(f'python3 -m virtualenv {env_name}')

elif dest[:2] == './':
    dest = dest.replace('.', os.getcwd())

else:
    os.system(f'python3 -m virtualenv {dest} {env_name}')

os.chdir(f'{dest}/{env_name}')
print(os.getcwd())
os.system('source ./bin/activate')

for req in requierments:
    os.system(f'python3 -m pip install {req} --user')

print('\n\n***FINISHED***')

3 Answers

I would add virtualenv deactivation into the script to ensure any other activated virtualenv environments are deactivated prior to trying to activate this one:

deactivate

If that doesn't work, try:

source ./bin/deactivate

You cannot activate a virtual environment ('venv') inside a Python script. The activate script must be sourced inside the bash session where you are going to use the venv.

What you can do is to write a bash function and put it in .bashrc. Something like this:

setup_venv() {
    local REQUIREMENTS="xerox sqlparse"

    local dest="$1"
    local env_name="$2"

    if [[ $dest == ./ ]]; then
        python3 -m virtualenv "$env_name" || return 1
    elif [[ $dest == ./* ]]; then
        dest="$pwd/${dest#.}"
    else
        python3 -m virtualenv "$dest" "$env_name" || return 1
    fi

    cd "$dest/$env_name"
    pwd
    source ./bin/activate

    for req in $REQUIREMENTS; do
        python3 -m pip install "$req" --user || return 1
    done

    echo -n "\n\n***FINISHED***"
}

maybe it's not very good but it's working for me.

the final answer is this:

setup_venv() {
    local REQUIREMENTS="xerox sqlparse"

    local dest="$1"
    local env_name="$2"

    first=$(pwd)
    if [[ $dest == ./ ]]; then
        dest=${dest/*/$first}
    elif [[ $dest == ./* ]]; then
        dest=${dest/./$first}
    fi

    new_dest=$dest/$env_name
    new_dest=${new_dest/\/\//\/}

    python3 -m virtualenv "$new_dest" || return 1
    cd $new_dest
    pwd
    source "$new_dest"/bin/activate

    for req in $REQUIREMENTS; do
        python3 -m pip install "$req"  || return 1
    done

}

Related