web-dev-qa-db-fra.com

Obtenir le chemin du dossier bin de virtualenv à partir du script

J'utilise virtualenvwrapper avec un projet Django comportant une tâche de gestion qui écrit automatiquement certains fichiers de configuration, de sorte que l'utilisateur doit simplement

./manage.py generate_configuration > much_Nice.conf

Et déplacez ensuite le fichier ailleurs. L'un des fichiers de configuration générés est une tâche pour supervisord qui lance un agent de céleri. Le problème que je reçois est que je ne sais pas comment afficher le chemin de l'exécutable céleri qui est dans le dossier bin de virtualenv. Essentiellement, j'aimerais avoir la sortie de la commande

which celery

Une option consiste à utiliser sys.executable, obtenir le dossier (qui semble être le dossier bin du virtualenv) et c'est tout ... mais je ne suis pas sûr.

Virtualenv ne dispose-t-il d'aucune méthode pour obtenir le chemin lui-même?

26
José Tomás Tocino

Le chemin d'accès à l'environnement virtuel se trouve dans la variable d'environnement VIRTUAL_ENV.

echo $VIRTUAL_ENV
57
Brad Culberson

Vous pouvez utiliser fabric pour faire de telles choses à partir de python

>>> from fabric.api import local
>>> local('which celery')
1
glmvrml

La variable d'environnement VIRTUAL_ENV n'est disponible que si l'environnement virtuel est activé.

Par exemple:

$ python3 -m venv myapp
$ source myapp/bin/activate
(myapp) $ python  -c "import os; print(os.environ['VIRTUAL_ENV'])"
/path/to/virtualenv/myapp

Si non activé, vous avez une exception:

(myapp) $ deactivate
$ myapp/bin/python -c "import os; print(os.environ['VIRTUAL_ENV'])"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/lib64/python3.4/os.py", line 635, in __getitem__
    raise KeyError(key) from None
KeyError: 'VIRTUAL_ENV'

Messagerie Internet uniquement, vous devez utiliser sys.executable pour obtenir le chemin de votre exécutable Python, .__, puis construire le chemin du céleri:

import sys
import os

celery_name = {'linux': 'celery', 'win32': 'celery.exe'}[sys.platform]
celery_path = os.path.join(os.path.dirname(sys.executable), celery_name)
0
Laurent LAPORTE