我正在尝试使用cronjob将python脚本设置为每两分钟运行一次,下面是crontab行。 python脚本由下面发布的shell脚本script.sh调用。此python脚本启动selenium Webdriver,收集一些数据并将其保存到csv文件中。也有一个摘要。
crontab
*/2 * * * * export DISPLAY=:0 && /home/me/workspace/project/script.sh > /home/me/workspace/project/cron.log 2>&1
需要导出DISPLAY =:0来运行cronjob中的硒,如here所示。 此位(> /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运行时未找到自定义安装的模块。我已经尝试用'/ usr / bin / env python3'或' / usr / bin / python3'及其其他变体,无济于事。
如果有人可以提出解决方案的提示,我将不胜感激,谢谢。
答案 0 :(得分:1)
#!/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
答案 1 :(得分:0)
尝试将当前的$ PATH值放在crontab的开头,即
PATH=/usr/local/bin:/usr/local/sbin......whatever echo $PATH outputs.....
* * * * * crontasks
默认情况下,cron不尊重.bashrc / .bash_profille和其他一些东西。