为root用户安装pip库

时间:2020-02-20 22:02:22

标签: python pip systemd

我有一个systemd服务,该服务定期读取root拥有的文件的第一行,进行转换,然后使用png_util:

import png_util

with open('root-owned-file', 'r') as f:
  f.read()

...rest of logic...

现在,当systemd守护程序启动时,它无权访问我通过pip安装的png_util库(pip install png_util),因为它仅为安装用户安装。当我使用sudo启动脚本时,也会发生这种情况:

ModuleNotFoundError: No module named 'png_util'

如果我读取了我所拥有的文件并以用户身份正常执行脚本,则一切正常。

系统服务:

[Unit]
Description=PNG

[Service]
ExecStart=/tmp/pngreader

[Install]
WantedBy=multi-user.target

使用pip install --user root用户然后以某种方式为root用户设置PYTHONPATH是不是一个窍门?

1 个答案:

答案 0 :(得分:3)

我认为您可以在虚拟环境中获得所需的东西。

您需要专门为该脚本创建虚拟环境。您将在该环境中以正确的版本安装所需的所有软件包。只要在该虚拟环境处于活动状态的情况下运行脚本,一切都将可用。-请参见venv documenttion here

要创建虚拟环境,请运行python3 -m venv <your_venv_path>,路径为您要存储的路径,例如〜/ .venvs / my_project /

要安装软件包,首先必须将其激活,然后运行pip

source <your_venv_path>/bin/activate
pip install png_util

到这里,您将准备好虚拟环境并安装软件包。如果您在虚拟环境处于活动状态下运行脚本,则该软件包将可用。

现在,因为您的脚本是守护程序this is how you make sure it runs within your virtual environment。基本上,虚拟环境会在其中创建Python副本,您只需在脚本中添加使用python“副本”的指令即可。您只需将#!<your_venv_path>/bin/python添加为脚本的第一行即可。

这样,当您的脚本运行时,它确实会在安装了所有软件包的虚拟环境中运行。

PS:只需将pip作为sudo运行,可能所有的东西都可以工作,因为它将在整个系统范围内安装软件包,使其对所有用户可用。但是强烈建议不要使用此选项,因为它会带来安全隐患,请参阅此post with security risks of running sudo pip

希望这会有所帮助!