我有一个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是不是一个窍门?
答案 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
希望这会有所帮助!