【问题标题】:Install pip libraries for root user为 root 用户安装 pip 库
【发布时间】:2025-11-29 02:05:02
【问题描述】:

我有一个 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'

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

systemd 服务:

[Unit]
Description=PNG

[Service]
ExecStart=/tmp/pngreader

[Install]
WantedBy=multi-user.target

技巧是简单地使用 pip install --user root 然后以某种方式为 root 用户设置 PYTHONPATH 吗?

【问题讨论】:

  • 为什么不使用 virtualenv?
  • 你试过 su 到 root 然后在 root 下 pip install 吗? Root 使用与用户不同的工作空间。
  • Virtualenv 是更好的选择。我的评论只是基于您询问 root 用户这一事实。

标签: python pip systemd


【解决方案1】:

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

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

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

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

希望这会有所帮助!

【讨论】:

  • 我不知道虚拟环境,但这确实有效。非常感谢您的详细描述!
  • 很高兴它很有用。虚拟环境很棒,最好将它们用于所有项目。主要好处是您拥有项目所需的所有包,只有您需要的包和运行该项目的环境中的正确版本。然后,如果不同的项目需要不同的版本,则不会混淆,因为每个项目都在自己的 venv 上运行。我肯定会研究这个并开始使用它。谷歌pip freeze &gt; requirements.txt 看看它是如何使用的。