Ответ 1
Путь к виртуальному env находится в переменной окружения VIRTUAL_ENV
echo $VIRTUAL_ENV
Я использую virtualenvwrapper с проектом django, у которого есть задача управления, которая автоматически записывает некоторые файлы конфигурации, поэтому пользователю просто нужно
./manage.py generate_configuration > much_nice.conf
И затем переместите файл в другое место. Один из сгенерированных файлов конфигурации - это задача супервизора, которая запускает работника сельдерея. Проблема, которую я получаю, заключается в том, что я не знаю, как выводить путь к исполняемому файлу celery в папке bin виртуального пользователя. По сути, я хотел бы получить вывод команды
which celery
Один из вариантов использует sys.executable
, получить папку (которая, кажется, является папкой bin
для virtualenv), и что она... но я не уверен.
Не имеет ли virtualenv какой-либо метод для получения самого пути?
Путь к виртуальному env находится в переменной окружения VIRTUAL_ENV
echo $VIRTUAL_ENV
Вы можете использовать ткань, чтобы делать такие вещи из python
>>> from fabric.api import local
>>> local('which celery')
VIRTUAL_ENV
среды VIRTUAL_ENV
доступна, только если виртуальная среда активирована.
Например:
$ python3 -m venv myapp
$ source myapp/bin/activate
(myapp) $ python -c "import os; print(os.environ['VIRTUAL_ENV'])"
/path/to/virtualenv/myapp
Если не активирован, у вас есть исключение:
(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, вы должны использовать sys.executable
чтобы получить путь к вашему исполняемому файлу Python, а затем построить путь к сельдерею:
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)