2016-05-13 23 views
23

Voglio "attivare" un virtualenv in un file di servizio systemd.Come abilitare un virtualenv in un'unità di servizio systemd?

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

mia soluzione attuale assomiglia a questo:

[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 io sto avendo difficoltà. Ottengo ImportErrors poiché mancano alcune entità in sys.path.

+0

Potete per favore includere gli errori si stanno ottenendo? –

+0

@PraveenYalagandula Il traceback non contiene alcuna informazione utile, poiché l'Eccezione ImportError e tutte le righe sopra di esso contengono solo codice personalizzato che non importa qui. – guettli

risposta

32

Il virtualenv è "inserito nell'interprete Python nel virtualenv". Questo significa che è possibile avviare python o console_scripts direttamente in quella virtualenv e non hanno bisogno di attivare il virtualenv prima o il gestore di PATH da soli .:

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

o

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

e rimuovere la voce EnvironmentFile.

Per verificare se è effettivamente corretto è possibile controllare sys.path eseguendo

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

e confrontando l'uscita per

python -m site 
+0

Sì, sys.path è corretto. Grazie. Ho controllato la differenza tra os.environ. Sembra che VIRTUAL_ENV non sia impostato, se uso '{{venv_home}}/bin/python'. Questo può creare problemi? – guettli

+0

Non lo so per certo ma non ho mai avuto problemi con 'VIRTUAL_ENV' non impostato. –

+1

buon punto Nils. Btw, fooservice.py non ha senso essere nella directory di venv_home, suppongo che sia un errore di battitura nella domanda. – chefarov

0

non sto usando virtualenv ma pyenv: qui è solo per usa il vero percorso .pyenv nello shebang e assicurati che sia nel PERCORSO

Es: pyenv attiva flask-prod per utente mortenb che è in esecuzione in prod

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

Poi, per i miei script boccetta a partire dal systemd * .service aggiungo il seguente baracca:

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