[Django]-Get virtualenv's bin folder path from script

138๐Ÿ‘

โœ…

The path to the virtual env is in the environment variable VIRTUAL_ENV

echo $VIRTUAL_ENV
๐Ÿ‘คBrad Culberson

24๐Ÿ‘

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 None
KeyError: 'VIRTUAL_ENV'

IMO, you should use sys.executable to get the path of your Python executable,
and then build the path to celery:

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)
๐Ÿ‘คLaurent LAPORTE

6๐Ÿ‘

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
๐Ÿ‘คLyle

0๐Ÿ‘

You can use fabric to do such things from python

>>> from fabric.api import local
>>> local('which celery')
๐Ÿ‘คglmvrml

Leave a comment