LINUX.ORG.RU

Python скрипт не видит site-packages из Cron

 ,


0

1

Всем здравствуйте.

У меня 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-ом модули сидят).

Подскажите, пожалуйста, дорогие друзья, что я делаю не так? Или что мне надо погуглить в какую сторону? Я так и не смог найти ответа.


Ответ на: комментарий от eternal_sorrow

Я… эээ… затрудняюсь ответить на этот вопрос.

Логинюсь под «pi», а задание в кронтаб писал, пользуясь командой «sudo crontab -e». Я не очень понимаю концепцию «супер-юзера», если честно.

Disona
() автор топика
Ответ на: комментарий от Disona

а надо sudo crontab -e -u pi

Я не очень понимаю концепцию «супер-юзера», если честно.

Супер юзер это обычный юзер только с абсолютными полномочиями.

eternal_sorrow ★★★★★
()

просто пропиши в кроне имя пользователя под которым ты запускаешь скрипт (т.е pi )

jo_b1ack ★★★★★
()
Ответ на: комментарий от Disona

Оно, может, и работает, но должно быть так:

#!/usr/bin/env python3

Centur1o
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.