为 root 用户安装 pip 库

Install pip libraries for root user

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

import png_util

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

...rest of logic...

现在,当 systemd 守护程序启动时,它无法访问我使用 pip (pip install png_util) 安装的 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 吗?

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

您需要专门为该脚本创建一个虚拟环境。您将在该环境中安装正确版本所需的所有软件包。只要您 运行 您的脚本与该虚拟环境处于活动状态,一切都将可用。- 请参阅 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 的副本,您只需在脚本中添加使用 "copy" 或 python 的指令即可。您只需将 #!<your_venv_path>/bin/python 添加为脚本的第一行即可。

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

PS:可能一切都可以通过简单地 运行ning pip as sudo 因为它会在整个系统范围内安装软件包,使其可供所有用户使用。但是,由于该选项会带来安全风险,因此强烈建议不要使用该选项,请参阅此 post with security risks of running sudo pip

希望对您有所帮助!!