Python не находит установленные пользователем модули при запуске из cronjob - PullRequest
0 голосов
/ 01 июля 2018

Я пытаюсь настроить запуск сценария python каждые две минуты с помощью cronjob, строка crontab находится ниже. Сценарий python вызывается сценарием оболочки script.sh, размещенным ниже. Этот скрипт Python запускает веб-драйвер Selen, собирает некоторые данные и сохраняет их в CSV-файл. Фрагмент также ниже.

кронтаб

    */2 * * * * export DISPLAY=:0 && /home/me/workspace/project/script.sh > /home/me/workspace/project/cron.log 2>&1

Экспорт DISPLAY =: 0 необходим для запуска селена в cronjob, как видно здесь . Этот бит (> /home/me/workspace/project/cron.log 2> & 1) регистрирует выходные данные и ошибки в файле cron.log.

script.sh

    #!/bin/bash
    python3 /home/me/workspace/project/foo.py

foo.py

    from datetime import datetime
    from selenium import webdriver
    from pyvirtualdisplay import Display

    display = Display(visible=0, size=(800, 600))
    display.start()
    with webdriver.Chrome() as driver:
        #do some scraping and save to csv
        pass

Когда я запускаю script.sh вручную, все работает без ошибок. Но когда я устанавливаю crontab, скрипт не работает. Файл cron.log показывает:

    Traceback (most recent call last):
    File "/home/me/workspace/project/foo.py", line 7, in <module>
        from selenium import webdriver
    ImportError: No module named 'selenium'

Это говорит о том, что селен не установлен, но замораживание pip3 | grep Селен дает:

    $ pip3 freeze | grep selenium
    selenium==3.13.0

Это показывает, что селен установлен (как и ожидалось, потому что скрипт работает нормально при запуске вручную). То же самое происходит с другой библиотекой, pyvirtualdisplay, если я закомментирую строку селен. Так что проблема в том, что по какой-то причине python не находит специально установленные модули при запуске через cronjob. Я уже пытался заменить 'python3' на '/ usr / bin / env python3' или '/ usr / bin / python3 'и другие его варианты, но безрезультатно.

Если бы кто-нибудь мог опубликовать намек на решение, я был бы благодарен.

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Попробуйте поместить текущее значение $ PATH в начало crontab, т.е.

PATH=/usr/local/bin:/usr/local/sbin......whatever echo $PATH outputs.....
* * * * * crontasks

По умолчанию cron не учитывает .bashrc / .bash_profille и некоторые другие вещи.

0 голосов
/ 01 июля 2018
#!/bin/bash
python3 /home/me/workspace/project/foo.py

Я думаю, что это твоя проблема. @Martijn Pieters замечен, когда говорит, что это проблема пути. Вы должны убедиться, что вызываемый вами «python3» - это python3, на котором установлен селен. Везде, где вы делаете остановку pip3, вы должны убедиться, что это то, что видит cron.

Когда я использую cronjobs, моя anaconda virtualenv явно запускает задание следующим образом:

/home/username/anaconda/envs/python3/bin/python /home/me/workspace/project/foo.py
...