我正在尝试使用 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
(似乎也有相应的pip
Python,因为你的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。