我有一条 udev 规则,每当块设备(USB 驱动器)连接到系统或从系统断开连接时,它都会触发一个 python 脚本。udev 规则似乎正确触发,但它调用的 python 脚本无法启动,因为它缺少导入。导入错误我得到 ModuleNotFound 错误。udev 脚本调用一个 bash 脚本,该脚本调用:
python3 /root/projects/script.py --arg "$1" --arg2 >> /tmp/python3.log 2>&1 &
在 python3.log 中,我看到错误:
ModuleNotFoundError: No module named 'requests'
我已经通过 以 root 身份安装了这个模块pip3 install requests
,并且确实当从 root shell 手动调用时脚本工作正常,但是不知何故被 udev 调用时却不起作用。
如果我从根终端运行pip3 install requests
我得到Requirement already satisfied: requests in /usr/local/lib/python3.9/dist-packages (2.27.1)
我认为这是一个路径问题?我该如何找出为什么 python 找不到此模块?
答案1
问题在于 Python 确定其“路径”的方式。我不知道这方面的最佳实践解决方案,但这是我所做的。从可以正常工作的 Python 控制台 ( sudo python3
),我执行import requests
此操作print(requests)
以获取完整路径。这给了我<module 'requests' from '/usr/local/lib/python3.9/dist-packages/requests/__init__.py'>
因此,在我的 script.py 中,我将其添加到顶部
import os
import sys
sys.path.append(os.path.abspath("/usr/local/lib/python3.9/dist-packages"))
问题已解决