kjo kjo - 1 month ago 8
Bash Question

How can a shell function know if it is running within a virtualenv?

How should a

bash
function test whether it is running inside a Python virtualenv?

The two approaches that come to mind are:

[[ "$(type -t deactivate)" != function ]]; INVENV=$?


or

[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$?


(Note: wanting
$INVENV
to be 1 if we're inside a virtualenv, and 0 otherwise, is what forces the backward-looking tests above.)

Is there something less hacky?

kjo kjo
Answer

Actually, I just found a similar question, from which one can easily derive an answer to this one:

Python: Determine if running inside virtualenv

E.g., a shell script can use something like

python -c 'import sys; print (sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0

(Thanks to Christian Long for showing how to make this solution work with Python 3 also.)

EDIT: Here's a more direct (hence clearer and cleaner) solution (taking a cue from JuanPablo's comment):

INVENV=$(python -c 'import sys; print ("1" if hasattr(sys, "real_prefix") else "0")')