2016-05-13 4 views
23

Я хочу «активировать» virtualenv в файле службы systemd.Как включить виртуальную машину в сервисном блоке systemd?

Я бы хотел, чтобы у меня не было процесса оболочки между процессом systemd и интерпретатором python.

Мое текущее решение выглядит следующим образом:

[Unit] 
Description=fooservice 
After=syslog.target network.target 

[Service] 
Type=simple 
User=fooservice 
WorkingDirectory={{ venv_home }} 
ExecStart={{ venv_home }}/fooservice --serve-in-foreground 
Restart=on-abort 
EnvironmentFile=/etc/sysconfig/fooservice.env 

[Install] 
WantedBy=multi-user.target 

/etc/sysconfig/fooservice.env

PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin 
PYTHONIOENCODING=utf-8 
PYTHONPATH={{ venv_home }}/... 
VIRTUAL_ENV={{ venv_home }} 

Но у меня возникли проблемы. Я получаю ImportErrors, поскольку некоторые из них в sys.path отсутствуют.

+0

Можете ли вы включать ошибки вы получаете? –

+0

@PraveenYalagandula Трассировка не содержит никакой полезной информации, так как ExpressionError Exception и все строки над ней содержат только настраиваемый код, который здесь не имеет значения. – guettli

ответ

32

Виртуализм «запекается в интерпретаторе Python в virtualenv». Это означает, что вы можете запустить python или console_scripts непосредственно в этом virtualenv и не нужно активировать virtualenv первой или управлять PATH себя .:

ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground 

или

ExecStart={{ venv_home }}/bin/python {{ venv_home }}/fooservice.py --serve-in-foreground 

и удалить EnvironmentFile запись.

Чтобы убедиться, что это действительно правильно, вы можете проверить, запустив sys.path

{{ venv_home }}/bin/python -m site 

и сравнивая вывод

python -m site 
+0

Да, sys.path правильный. Спасибо. Я проверил разницу между os.environ. Кажется, что VIRTUAL_ENV не установлен, если я использую '{{venv_home}}/bin/python'. Это может вызвать проблемы? – guettli

+0

Я не знаю наверняка, но у меня никогда не было проблем с 'VIRTUAL_ENV', которые не были установлены. –

+1

хорошая точка Nils. Btw, fooservice.py не имеет смысла находиться внутри каталога venv_home, я полагаю, что это опечатка в вопросе. – chefarov

0

Я не использую virtualenv но pyenv: вот это просто используйте реальный путь .pyenv в shebang и убедитесь, что он находится в PATH

Ex: pyenv активировать колбу-продукт для пользователя mortenb, который работает в prod

/home/mortenb/.pyenv/versions/flask-prod/bin/python --version 
Python 3.6.2 

Затем флягу скрипты, начинающиеся в Systemd * .Service добавить следующий притон:

#!/home/mortenb/.pyenv/versions/flask-prod/bin/python3