无法使用 systemd 守护 python 脚本 - 没有名为“oandapyV20”的模块

无法使用 systemd 守护 python 脚本 - 没有名为“oandapyV20”的模块

我正在尝试使用 systemd 对 python 脚本进行守护进程,但在激活守护进程后不断收到错误“没有名为‘oandapyV20’的模块”。

该脚本位于以下位置:/home/user/workingdir/script.py

虚拟环境位于:/home/user/venv/bin/

我对如何根据我找到的文档构建服务的最佳猜测如下:

[Unit]
Description=DataLoader
[Service]
User=root
Group=root
WorkingDirectory=/home/user/workingdir
ExecStart=/home/user/venv/bin/python3 script.py
[Install]
WantedBy=multi-user.target

有什么作用...

python3脚本.py

或激活虚拟环境

源/home/user/venv/bin/activate; python3脚本.py

尽管这在服务之外有效,但从 systemd 调用时我尝试过的任何方法都不起作用。

我哪里错了?我没有意识到什么?

最终解决方案(了解很少)

[Unit]
Description=DataLoader
[Service]
User={user_name}
Group={user_name}
WorkingDirectory=/home/{user_name}/workingdir
ExecStart=/usr/bin/python3 script.py
Restart=always
[Install]
WantedBy=multi-user.target

答案1

看来您一直在这样的假设下进行操作:每当您调用 时source /home/user/venv/activate,该python3命令(以及该pip3命令)随后都会从 调用相关的可执行文件/home/user/venv/bin

但是,您在评论中添加的澄清表明假设是不正确的。运行时您没有从虚拟环境中调用 python script.py;你一直在调用Python /usr/bin(似乎也有相应的pipPython,因为你的virtualenv中的Python似乎没有oandapyV20安装该模块,而系统Python却安装了该模块。)

检查输出

echo $PATH
echo $PYTHONPATH

环境$PATH变量是输入命令时要搜索的系统上以冒号分隔的路径列表。要么/home/user/venv/bin不存在于该列表中,要么出现在 出现之后/usr/bin,其中包含python3($PATH将在第一个匹配后停止扫描。)的匹配项通常由(或如果未设置)$PATH设置,并且如果您的假设是正确的,本来会被设置在它前面。$HOME/.bashrc/etc/bashrc/home/user/venv/activate$PATH/home/user/venv/bin

$PYTHONPATH应该告诉 python 在哪里寻找要加载的模块。 (也可以使用 来修改或从脚本中读取它sys.path

这解释了为什么改变你的 systemd 单元的命令有效——它最终调用了你的工作命令所执行的相同的 python。

相关内容