为 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
希望对您有所帮助!!
我有一个 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
希望对您有所帮助!!