Як увімкнути virtualenv у сервісному блоці systemd?


85

Я хочу "активувати" virtualenv у файлі служби 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, оскільки деякі enties у sys.path відсутні.


Чи можете ви включити помилки, які ви отримуєте?
Правен Ялагандула

@PraveenYalagandula Відстеження не містить корисної інформації, оскільки виняток ImportError та всі рядки над ним містять лише спеціальний код, який тут не має значення.
guettli

Відповіді:


112

Virualenv "запечений у інтерпретаторі 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

2
хороший момент Нільс. До речі, fooservice.py не має сенсу знаходитись у каталозі venv_home, я гадаю, це друкарська помилка у питанні.
stelios

4
Зверніть увагу, що запропоновані команди друку несумісні з Python 3. Якщо ви використовуєте принаймні python 2.4, ви можете просто використовувати:, python -m siteщоб отримати добре відформатований вивід змінної sys.path разом із додатковою інформацією.
Марк Едінгтон,

2
Охайно, я не знав про python -m site. Я скоригував свою відповідь.
Nils Werner

1
@ NilsWerner Я врешті-решт вирішив це, породивши оболонку, на Ubuntu 17.10 більше нічого не працювало: github.com/umccr/pcgr-deploy/blob/master/ansible/files/ ... ... проігноруйте шаблон jinja2 для ansible, це правильно розширюється при розгортанні.
мозковий штурм

6
Для тих, хто цікавиться, чи це ніндзя2 ... ні, подвійні фігурні дужки - це просто заповнювачі, винайдені ОП: superuser.com/questions/1209919/…
ankostis

11

Хоча шлях до бібліотек справді запечений у інтерпретаторі python virtualenv, у мене були проблеми з інструментами python, які використовували бінарні файли, встановлені в цьому virtualenv. Наприклад, моя служба повітряного потоку apache не працюватиме, оскільки не може знайти gunicornдвійковий файл. Щоб обійти це, ось моя ExecStartінструкція з Environmentінструкцією (яка встановлює змінну середовища для однієї служби).

ExecStart={{ virtualenv }}/bin/python {{ virtualenv }}/bin/airflow webserver
Environment="PATH={{ virtualenv }}/bin:{{ ansible_env.PATH }}"

ExecStartявно використовує інтерпретатор python virtualenv. Я також додаю PATHзмінну, яка додає двійкову папку virtualenv перед системою PATH. Таким чином, я отримую бажані бібліотеки python, а також бінарні файли.

Зверніть увагу, що я використовую ansible для побудови цієї служби, наприклад, фігурних дужок jinja2.


1

Я використовую не virtualenv, а pyenv: ось він просто для того, щоб використати справжній шлях .pyenv у shebang і переконатися, що він знаходиться у PATH

Приклад: pyenv активує flask-prod для користувача 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

0

У моєму випадку я просто намагався додати змінні середовища, необхідні для Flask, наприклад

[Service]
Environment="PATH=/xx/yy/zz/venv/bin"
Environment="FLASK_ENV=development"
Environment="APP_SETTINGS=config.DevelopmentConfig"

Я використовував virtualenv, а /xx/yy/zz/venv/binтакож шлях до папки virtualenv.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.