Obtener la ruta de la carpeta bin de virtualenv desde el script

Estoy usando virtualenvwrapper con un proyecto de django que tiene una tarea de administración que escribe automáticamente algunos archivos de configuración, por lo que el usuario solo tiene que

./manage.py generate_configuration > much_nice.conf 

Y luego mover el archivo a otro lugar. Uno de los archivos de configuración generados es una tarea para supervisord que inicia un trabajador de apio. El problema que obtengo es que no sé cómo generar la ruta del ejecutable de apio que se encuentra dentro de la carpeta bin de virtualenv. Esencialmente, me gustaría tener la salida del comando

 which celery 

Una opción es usar sys.executable , obtener la carpeta (que parece ser la carpeta bin del virtualenv) y eso es todo … pero no estoy seguro.

¿Virtualenv no tiene ningún tipo de método para obtener la ruta?

La ruta al entorno virtual está en la variable de entorno VIRTUAL_ENV

 echo $VIRTUAL_ENV 

La variable de entorno VIRTUAL_ENV solo está disponible si el entorno virtual está activado.

Por ejemplo:

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

Si no está activado, tiene una excepción:

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

En mi opinión, debe usar sys.executable para obtener la ruta de acceso de su ejecutable de Python, y luego construir la ruta de apio:

 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) 

Puedes usar tela para hacer esas cosas desde python.

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