Get virtualenv's bin folder path from script
The path to the virtual env is in the environment variable VIRTUAL_ENV
echo $VIRTUAL_ENV
The VIRTUAL_ENV
environment variable is only available if the virtual environment is activated.
For instance:
$ python3 -m venv myapp$ source myapp/bin/activate(myapp) $ python -c "import os; print(os.environ['VIRTUAL_ENV'])"/path/to/virtualenv/myapp
If not activated, you have an 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 NoneKeyError: 'VIRTUAL_ENV'
IMO, you should use sys.executable
to get the path of your Python executable,and then build the path to celery:
import sysimport oscelery_name = {'linux': 'celery', 'win32': 'celery.exe'}[sys.platform]celery_path = os.path.join(os.path.dirname(sys.executable), celery_name)
How about referencing sys.prefix? It always outputs a result regardless of a virtualenv is activated or not, and also it's more convenient than getting grand parent position of sys.executable.
$ python -c 'import sys;print(sys.prefix)'/usr$ . venv/bin/activate(venv) $ python -c 'import sys;print(sys.prefix)'path/to/venv