Comment une fonction shell savoir si elle est en cours d'exécution dans un virtualenv?
Comment bash
test de la fonction si elle est en cours d'exécution à l'intérieur d'un Python virtualenv?
Les deux approches qui viennent à l'esprit sont:
[[ "$(type -t deactivate)" != function ]]; INVENV=$?
ou
[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$?
(Note: vouloir $INVENV
à 1 si nous sommes à l'intérieur d'un virtualenv, et 0 sinon, est ce que les forces de la regarder en arrière les tests ci-dessus.)
Est-il quelque chose de moins hacky?
- Il est également
command -v
, une coque intégrée.
Vous devez vous connecter pour publier un commentaire.
MODIFIER: comme @ThiefMaster mentionne dans les commentaires, dans certaines conditions (par exemple, lors du démarrage d'un nouveau shell – peut-être dans
tmux
ouscreen
– à partir de l'intérieur d'un actif virtualenv) cette case peut échouer (toutefois, la création de nouveaux obus dans un virtualenv peut causer d'autres problèmes, que je ne le recommande pas).$VIRTUAL_ENV
a été fixé, mais (pour quelque raison), pas dans$PATH
...$PATH
a à faire avec elle? Ou voulez-vous dire que vous voulez vérifier si votre répertoire de travail actuel est partie d'un virtualenv?$VIRTUAL_ENV
n'est pas dans$PATH
puis lepython
exécutable qui est utilisé par tout le reste ne sera pas la seule dans le virtualenv. Par lui-même, l'affectation d'une valeur à$VIRTUAL_ENV
ne fait rien.$VIRTUAL_ENV
, il le vérifie. Quand il existe, cela signifie un environnement virtuel est actif (si la variable est définie par laactivate
script, et retirés pardeactivate
). Qui est ce que tu voulais, non?En fait, je viens de trouver une question similaire, à partir de laquelle on peut facilement obtenir une réponse à celui-ci:
Python: Déterminer si l'exécution de l'intérieur virtualenv
E. g., un script shell pouvez utiliser quelque chose comme
(Merci à Christian de Long pour montrer comment faire de cette solution de travail avec Python 3 aussi.)
EDIT: Voici une façon plus directe (et donc plus claires et plus propre) solution (en prenant un repère de JuanPablo commentaire):
python -c 'import sys; print hasattr(sys, "real_prefix")'
python -c 'import sys; print(sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0
Si vous utilisez virtualenvwrappers il y a des pré/post-scripts qui s'exécutent qui pourrait définir INVENV pour vous.
Ou ce que je fais, placez le code suivant dans votre .bashrc, et d'en faire un fichier appelé .venv dans votre répertoire de travail (par django), de sorte que le virtuel env est chargé automatiquement lorsque vous insérez le cd de répertoire
OLDPWD
, qui la même chose quePREVPWD
dans votre code.