Python 为root用户安装pip库

Python 为root用户安装pip库,python,pip,systemd,Python,Pip,Systemd,我有一个systemd服务,它定期读取根文件的第一行,对其进行转换,然后使用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启动脚本时,也会发生这种情况: ModuleNotFoun

我有一个systemd服务,它定期读取根文件的第一行,对其进行转换,然后使用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'
如果我读取自己拥有的文件,并以用户身份正常执行脚本,则一切正常

systemd服务:

[Unit]
Description=PNG

[Service]
ExecStart=/tmp/pngreader

[Install]
WantedBy=multi-user.target

诀窍是简单地使用pip安装--user root,然后以某种方式为root用户设置PYTHONPATH吗?

我认为您可以通过虚拟环境获得所需的功能

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

要创建一个虚拟环境,请运行python3-m venv,路径为您要存储它的位置,例如~/.venvs/my_项目/

要安装软件包,首先必须使其处于活动状态,然后运行pip

source <your_venv_path>/bin/activate
pip install png_util
source/bin/activate
pip安装png_util
到这里,您将准备好虚拟环境并安装软件包。如果在虚拟环境处于活动状态的情况下运行脚本,则包将可用

现在,因为您的脚本是一个守护进程。基本上,虚拟环境在中创建一个Python副本,您只需在脚本中添加使用该Python“副本”的指令。您只需添加
#即可/bin/python
作为脚本的第一行

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

PS:通过简单地以sudo的形式运行pip,可能所有东西都可以工作,因为它将在系统范围内安装软件包,使其可供所有用户使用。但是,由于它所带来的安全风险,这种选择是非常不受欢迎的,请参见此


希望这有帮助

我想你可以通过虚拟环境得到你需要的东西

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

要创建一个虚拟环境,请运行python3-m venv,路径为您要存储它的位置,例如~/.venvs/my_项目/

要安装软件包,首先必须使其处于活动状态,然后运行pip

source <your_venv_path>/bin/activate
pip install png_util
source/bin/activate
pip安装png_util
到这里,您将准备好虚拟环境并安装软件包。如果在虚拟环境处于活动状态的情况下运行脚本,则包将可用

现在,因为您的脚本是一个守护进程。基本上,虚拟环境在中创建一个Python副本,您只需在脚本中添加使用该Python“副本”的指令。您只需添加
#即可/bin/python
作为脚本的第一行

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

PS:通过简单地以sudo的形式运行pip,可能所有东西都可以工作,因为它将在系统范围内安装软件包,使其可供所有用户使用。但是,由于它所带来的安全风险,这种选择是非常不受欢迎的,请参见此


希望这有帮助

为什么不使用virtualenv?您是否尝试过su根目录,然后pip根目录下安装?Root使用的工作区与用户不同。顺便说一句,Virtualenv是更好的选择。我的评论只是基于您询问Root用户的事实。为什么不使用Virtualenv?您是否尝试过su Root,然后在Root下进行pip安装?Root用户使用的工作区与用户不同。顺便说一句,Virtualenv是更好的选择。我的评论是基于您询问Root用户的事实。我不知道虚拟环境,但这确实有效。非常感谢您的详细描述!!很高兴它有用。虚拟环境非常好,最好将其用于所有项目。主要的好处是,您拥有项目所需的所有软件包,只有您需要的软件包和运行该项目的环境中的正确版本。然后,如果一个不同的项目需要不同的版本,没有什么会混淆,因为每个项目都在自己的venv上运行。我肯定会研究这一点,并开始使用它的所有时间。谷歌
pipfreeze>requirements.txt
查看它是如何使用的。我不知道虚拟环境,但这确实有效。非常感谢您的详细描述!!很高兴它有用。虚拟环境非常好,最好将其用于所有项目。主要的好处是,您拥有项目所需的所有软件包,只有您需要的软件包和运行该项目的环境中的正确版本。然后,如果一个不同的项目需要不同的版本,没有什么会混淆,因为每个项目都在自己的venv上运行。我肯定会研究这一点,并开始使用它的所有时间。谷歌
pipfreeze>requirements.txt
查看它是如何使用的。