Подтвердить что ты не робот

Получить виртуальный путь папки bin из script

Я использую virtualenvwrapper с проектом django, у которого есть задача управления, которая автоматически записывает некоторые файлы конфигурации, поэтому пользователю просто нужно

./manage.py generate_configuration > much_nice.conf

И затем переместите файл в другое место. Один из сгенерированных файлов конфигурации - это задача супервизора, которая запускает работника сельдерея. Проблема, которую я получаю, заключается в том, что я не знаю, как выводить путь к исполняемому файлу celery в папке bin виртуального пользователя. По сути, я хотел бы получить вывод команды

which celery

Один из вариантов использует sys.executable, получить папку (которая, кажется, является папкой bin для virtualenv), и что она... но я не уверен.

Не имеет ли virtualenv какой-либо метод для получения самого пути?

4b9b3361

Ответ 1

Путь к виртуальному env находится в переменной окружения VIRTUAL_ENV

echo $VIRTUAL_ENV

Ответ 2

Вы можете использовать ткань, чтобы делать такие вещи из python

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

Ответ 3

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)