2016-05-13 62 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