如何在systemd服务单元中启用virtualenv?

gue*_*tli 61 python environment-variables virtualenv

我想在系统服务文件中"激活"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
Run Code Online (Sandbox Code Playgroud)

/etc/sysconfig/fooservice.env

PATH={{ venv_home }}/bin:/usr/local/bin:/usr/bin:/bin
PYTHONIOENCODING=utf-8
PYTHONPATH={{ venv_home }}/...
VIRTUAL_ENV={{ venv_home }}
Run Code Online (Sandbox Code Playgroud)

但我遇到了麻烦.我得到ImportErrors,因为缺少sys.path中的一些内容.

Nil*_*ner 89

virtualenv"融入了virtualenv中的Python解释器".这意味着你可以启动pythonconsole_scripts直接在virtualenv中启动,而不需要先激活virtualenv或PATH自己管理:

ExecStart={{ venv_home }}/bin/fooservice --serve-in-foreground
Run Code Online (Sandbox Code Playgroud)

要么

ExecStart={{ venv_home }}/bin/python {{ venv_home }}/fooservice.py --serve-in-foreground
Run Code Online (Sandbox Code Playgroud)

并删除该EnvironmentFile条目.

要验证它确实是正确的,您可以sys.path通过运行来检查

{{ venv_home }}/bin/python -m site
Run Code Online (Sandbox Code Playgroud)

并将输出与...进行比较

python -m site
Run Code Online (Sandbox Code Playgroud)

  • 请注意,建议的打印命令与Python 3不兼容.如果您至少使用python 2.4,您也可以使用:`python -m site`来获取sys.path变量的格式良好的输出以及其他信息. (4认同)
  • 对于那些想知道这是否是ninja2 ......的人来说,双花括号只是OP发明的占位符:https://superuser.com/questions/1209919/what-do-double-curly-braces-mean-in -systemd的脚本 (4认同)
  • 好点尼尔斯.顺便说一句,fooservice.py没有意义进入venv_home目录,我想这是一个问题的拼写错误. (2认同)
  • 整洁,我不知道`python -m site`。我已经调整了我的答案。 (2认同)
  • 当您启动的 python 进程期望激活 virtualenv 时,这种方法不起作用。例如,考虑`{{ venv_home }}/bin/python -m newrelic.admin run-program python -m myapp`。这将在 venv 中启动 python,调用 New Relic,然后它将无法启动应用程序,因为 `python` 不在路径中,因为 venv 未激活。 (2认同)

Seb*_*rio 6

例如,就我而言,我只是尝试添加 Flask 所需的环境变量

[Service]
Environment="PATH=/xx/yy/zz/venv/bin"
Environment="FLASK_ENV=development"
Environment="APP_SETTINGS=config.DevelopmentConfig"
Run Code Online (Sandbox Code Playgroud)

我使用的是 virtualenv,所以/xx/yy/zz/venv/bin是 virtualenv 文件夹的路径。


Ale*_*ard 5

虽然库的路径确实包含在virtualenv的python解释器中,但是我对使用安装在virtualenv中的二进制文件的python工具遇到了问题。例如,我的Apache Airflow服务无法正常工作,因为它找不到gunicorn二进制文件。要解决此问题,这是我的ExecStart指令,其中包含Environment指令(仅为服务设置环境变量)。

ExecStart={{ virtualenv }}/bin/python {{ virtualenv }}/bin/airflow webserver
Environment="PATH={{ virtualenv }}/bin:{{ ansible_env.PATH }}"
Run Code Online (Sandbox Code Playgroud)

ExecStart显式使用virtualenv的python解释器。我还添加了一个PATH变量,该变量在system之前添加了virtualenv的二进制文件夹PATH。这样,我就获得了所需的python库和二进制文件。

请注意,我正在使用ansible来构建此服务,因此请使用jinja2的花括号。

  • 从字面上看,是为了寻找如何在服务中设置环境,因为气流找不到gunicorn。没有失望!谢谢你!我已经启动并运行了。 (2认同)