2016-05-13 24 views
23

我想「激活」systemd服務文件中的virtualenv。如何在systemd服務單元中啓用virtualenv?

我想避免在systemd進程和python解釋器之間有一個shell進程。

我目前的解決辦法是這樣的:

[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回溯沒有包含任何有用的信息,因爲ImportError異常和它上面的所有行只包含自定義代碼,在這裏並不重要。 – guettli

回答

32

virtualenv「被燒入virtualenv中的Python解釋器」。這意味着你可以在virtualenv中推出pythonconsole_scripts直接,並不需要自己先激活的virtualenv或管理PATH

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

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

並刪除EnvironmentFile條目。

要驗證它確實是正確的,你可以通過運行

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

,我沒有使用的virtualenv輸出比較

python -m site 
+0

是的,sys.path是正確的。謝謝。我檢查了os.environ之間的區別。似乎VIRTUAL_ENV沒有設置,如果我使用'{{venv_home}}/bin/python'。這會造成麻煩嗎? – guettli

+0

我不確定,但是我從未遇到'VIRTUAL_ENV'沒有設置的問題。 –

+1

好點的尼爾斯。順便說一句,fooservice.py沒有意義,在venv_home目錄內,我想它是一個錯誤的問題。 – chefarov

0

但pyenv檢查sys.path:這裏是剛請使用shebang中真實的.pyenv路徑,並確保它位於路徑中,並確保它位於路徑中。例如:pyenv激活用戶mortenb的燒瓶產品,該產品在產品中運行

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

然後我在systemd開始燒瓶腳本*。服務我添加下面的家當:

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