web-dev-qa-db-fra.com

Comment activer une virtualenv dans une unité de service systemd?

Je veux "activer" un virtualenv dans un fichier de service systemd.

Je voudrais éviter d'avoir un processus Shell entre le processus systemd et l'interpréteur python.

Ma solution actuelle ressemble à ceci:

[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 }}

Mais j'ai des problèmes. Je reçois ImportErrors car il manque des entrées dans sys.path.

59
guettli

Le virtualenv est "intégré dans l’interprète Python du virtualenv"). Cela signifie que vous pouvez lancer python ou console_scripts directement dans ce virtualenv et n’a pas besoin d’activer d’abord le virtualenv ni de gérer vous-même PATH:

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

ou

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

et supprimez l'entrée EnvironmentFile.

Pour vérifier qu'il est bien correct, vous pouvez vérifier sys.path en exécutant

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

et en comparant la sortie à

python -m site
82
Nils Werner

Bien que le chemin des bibliothèques soit en effet intégré dans l’interprète python du virtualenv, j’ai eu des problèmes avec les outils python qui utilisaient des binaires installés dans ce virtualenv]). Par exemple, mon service de flux d’air Apache ne fonctionnerait pas car il ne trouvait pas le binaire gunicorn. Pour contourner ce problème, voici mon instruction ExecStart avec un Environment instruction (qui définit une variable d’environnement pour le service uniquement).

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

ExecStartexplicitement, utilise l'interprète python de virtualenv. J'ajoute également une variable PATH, qui ajoute le dossier binaire du virtualenv avant le système PATH. Ainsi, les bibliothèques souhaitées python ainsi que les fichiers binaires).

Notez que j'utilise ansible pour construire ce service, entre les accolades de jinja2.

3
Alexis Lessard