variable - virtualenv-- python




Come abilitare un virtualenv in un'unità di servizio systemd? (2)

Mentre il percorso per le librerie è effettivamente inserito nell'interprete python di virtualenv, ho avuto problemi con gli strumenti python che utilizzavano binari installati in quel virtualenv. Ad esempio, il mio servizio di flusso d'aria di Apache non funzionava perché non riusciva a trovare il binario di gunicorn . Per ovviare a questo, ecco la mia istruzione ExecStart , con un'istruzione Environment (che imposta una variabile d'ambiente solo per il servizio).

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

ExecStart utilizza esplicitamente l'interprete python di virtualenv. Sto anche aggiungendo una variabile PATH , che aggiunge la cartella binaria di virtualenv prima del PATH sistema. In questo modo, ottengo le librerie python desiderate e anche i binari.

Si noti che sto usando Ansible per creare questo servizio, quindi le parentesi graffe di jinja2.

Voglio "attivare" un virtualenv in un file di servizio systemd.

Vorrei evitare di avere un processo shell tra il processo systemd e l'interprete python.

La mia soluzione attuale si presenta così:

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

Ma sto avendo problemi. Ottengo ImportErrors poiché mancano alcune entità in sys.path.


Non sto usando virtualenv ma pyenv: ecco solo per usare il vero percorso .pyenv nello shebang e assicurarmi che sia nel PERCORSO

Es: pyenv attiva il pallone-prod per l'utente mortenb che è in esecuzione in prod

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

Quindi ai miei script di matraccio che iniziano in systemd * .service aggiungo il seguente shebang:

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




virtualenv