Shell Scripts for Virtual Python Environments
Python development without virtual environments is a pain; with virtual environments it quickly gets messy. Here is a shell script to make life with Python easier.
Below are the functions I have added in a script that’s sourced by the shell:
#!/bin/bash
__PY_ENVS__="$HOME/Python"
function py() {
local environment="${1:-default}"
if [ -d "${__PY_ENVS__}/${environment}" ]; then
source "${__PY_ENVS__}/${environment}/bin/activate" && which python3
else
echo "Sorry, but ${environment} does not yet exist."
echo "Please create it with pyenv ${environment} first."
fi
}
function pyenv() {
local environment="${1:-default}"
if [ -d "${__PY_ENVS__}/${environment}" ]; then
echo "Sorry, but ${environment} already exists."
echo "Please activate it with py ${environment} instead."
else
python3 -m venv "${__PY_ENVS__}/$environment" && \
py "${environment}" && \
pip3 install --upgrade pip && \
pip3 install black
fi
}
function pipins() {
pip3 install -r "${1:-requirements.txt}"
}
function pyenvs() {
ls "${__PY_ENVS__}"
}
function nopyenv() {
local environment="$1"
if [ -d "${__PY_ENVS__}/${environment}" ]; then
rm -rf "${__PY_ENVS__}/${environment}"
else
echo "Sorry, but ${environment} does not exist."
echo "The following environments are available:"
pyenvs
fi
}
All virtual environments live in ~/Python.
The default environment is called default and it can be activated with py.
How to…
Create a New Environment
If you want to set up a new environment, you can simply execute pyenv my_new_env.
It sets up a Python 3 environment to which you can install library dependencies as needed.
I automatically add Black, because most projects I have worked with assume you have a formatter already on your machine, although it is rarely listed in the requirements file and therefore not installed when you run pipins.
What’s pipins?
When you run pipins requirements.txt, the shell will install all the packages defined in requirements.txt in the virtual environment.
The default argument is requirements.txt, so you can also leave it off.
Activate an Existing Environment
For an environment you have already set up, run py my_existing_env and it will be active in the terminal.
Note that the default environment has to be created before you can use it.
A single execution of pyenv suffices.
In IntelliJ, PyCharm, or whatever IDE you prefer, you may have to point your project to that specific virtual environment to ensure there is a Python SDK available.
Remove an Existing Environment
With nopyenv my_obsolete_environment you delete the environment altogether.
List All Environments
To list all existing environments you use pyenvs.
Notes
If you have a company-internal index for Python packages, you can add the following to the pipins function:
--trusted-host "${__PY_HOST__}" --extra-index-url "${__EXTRA_INDEX_URL__}"
Of course you first have to define both __HOST__ and __EXTRA_INDEX_URL__.
If you have set HTTP(S)_PROXY variables, you may have to add
export NO_PROXY="${__PY_HOST__}"
in your profile to ensure the host on the company’s internal network is not accessed through a proxy.