Python скрипт не видит site-packages из Cron
Всем здравствуйте.
У меня Raspberry Pi с установленной Raspberry OS Desktop. Насколько я понимаю - это на базе Ubuntu (я в Linux-ах не очень понимаю, извинити).
Я хочу, чтобы при запуске Raspberry у меня автоматом запускался скрипт на Питоне и крутился там себе.
Скрипт я сначала проверил просто запуском и на винде, и на малине - он работает, как от него и ожидается.
Начитавшись гугла понял, что для моей задачи - запуск после загрузки - можно использовать крон.
Питоновый скрипт расположен вот так:
/home/pi/PyScripts/forumBotLin/RSSparser.py
В начале скрипта я прописал ''' !# usr/bin/python3 ''' и сделал сам скрипт исполняемым через «chmod». Его «исполняемость» видно в MidnightCommander - обозначен звёздочкой.
Дальше я пытался всеми правдами и неправдами заставить этот скрипт запускаться из крона напрямую, но никак не выходило. Вроде питон запускался, а скрипт почему-то не видел. В кроне я прописал так:
@reboot python3 /home/pi/PyScripts/forumBotLin/RSSparser.py >> /home/pi/BashScripts/cronlog2.log 2>&1 &
В логах было такое:
python3: can't open file '/home/pi/PyScripts/forumBotLin/RSSparser.py': [Errno 2] No such file or directory
Нагуглить решение быстро не вышло, поэтому в итоге я пришёл к такому «обходу»: написал bash-скрипт, запускающий мой python-скрипт, а кроном уже запускал этот bash-скрипт.
Содержимое bash-скрипта:
#!/bin/bash
cd /home/pi/PyScripts/forumBotLin/
python3 RSSparser.py
Содержимое расписание крона:
@reboot bash /home/pi/BashScripts/startRSSparser >> /home/pi/BashScripts/cronlog.log 2>&1 &
Вывод программы сделал в файл, как видите.
В терминале проверил, что bash нормально запускает скрипт - всё ок, работает.
В таком варианте по крайней мере после загрузки Raspberry скрипт на питоне начал хотя бы запускаться, но он тут же вылетал, потому что не мог загрузить нужный модуль. А когда вручную запускал - всё было нормально.
Чтобы посмотреть, где питон берёт модули при запуске кроном, я в начале скрипта добавил вывод PATH самого питона:
import sys
print(sys.executable)
for path in sys.path:
print(path)
После чего в логах отработки скрипта после загрузки малины увидел следующее:
/usr/bin/python3
/home/pi/PyScripts/forumBotLin
/usr/lib/python37.zip
/usr/lib/python3.7
/usr/lib/python3.7/lib-dynload
/usr/local/lib/python3.7/dist-packages
/usr/lib/python3/dist-packages
Так вот, тут нету на мой взгляд самого главного - site-packages. Если я запускаю из терминала python3 и там в интерактивном режиме таким же образом вывожу PATH, то вижу следующее:
/usr/lib/python37.zip
/usr/lib/python3.7
/usr/lib/python3.7/lib-dynload
/home/pi/.local/lib/python3.7/site-packages
/usr/local/lib/python3.7/dist-packages
/usr/lib/python3/dist-packages
Вот тут есть site-packages, где и расположен нужный моему скрипту модуль (как я понимаю, там все загружаемые pip-ом модули сидят).
Подскажите, пожалуйста, дорогие друзья, что я делаю не так? Или что мне надо погуглить в какую сторону? Я так и не смог найти ответа.