我在我的Raspberry PI上运行Ubuntu Mate
。我用Python编写了一个web 刮板,我想每天运行一次。我认为使用sudo crontab -e
是一种很好的方法。我遇到的问题是,当cronjob
启动我的python脚本时,python脚本抛出一个导入错误而不运行。但是,当我从命令行直接执行python脚本时,它将运行而不会出现问题。
我读到一些人使用shell脚本来启动python脚本,所以我也尝试了。同样,当我直接从命令行执行shell脚本时,它可以正常工作,但在由cronjob
执行时不起作用。
为了测试目的,现在我有一个cronjob
来执行每一分钟,直到我弄清楚到底发生了什么。一旦它按预期工作,我将把它执行的时间更改为更接近我想要的东西。
想让你知道我的文件是什么样子,请看下面。如您所见,所有需要运行的文件都具有执行效率。
web_scraper.py
#!/usr/bin/env python
import click
import logging
import os
from datetime import datetime
from bs4 import BeautifulSoup as bs
import re
import urlparse
...
start.sh
#!/bin/bash
cd /home/elmer/
python web_scraper.py
-e
* * * * * sh /home/elmer/start.sh >> /home/elmer/cron.log 2>&1
cron.log
Traceback (most recent call last):
File "web_scraper.py", line 6, in <module>
import click
ls -lh
(py27)elmer@elmer-rpi:$ ls -lh
total 56K
-rw-rw-r-- 1 elmer elmer 2.9K Mar 17 20:38 cron.log
-rwxrwxrwx 1 elmer elmer 8.2K Mar 16 09:54 web_scraper.py
-rwxrwxrwx 1 elmer elmer 64 Mar 17 20:02 start.sh
发布于 2017-03-18 01:47:41
问题是,您正在以自己的身份运行脚本,但随后将其作为root放在cron中。这两个不同的用户有非常不同的环境。
您应该使用crontab -e
而不是sudo crontab -e
将其放入您自己帐户的cron中。您还可以从cron命令行的开头删除sh
,因为这是默认的。
如果它仍然不起作用,解决方案可能会在您的常规shell中echo $PYTHONPATH
,然后将该设置添加到cron中:
PYTHONPATH=/your/path/here
* * * * * python /home/elmer/web_scraper.py >> /home/elmer/cron.log 2>&1
另一个不使用sudo crontab
的好理由是,如果您以根用户身份运行脚本,那么它所包含的任何bug都可能破坏您的系统。
发布于 2022-08-09 16:44:02
我不知道是什么导致了这一错误,但约翰·兹温克指出的似乎是正确的答案。
我的问题是什么
与@CurtLH类似,我让crontab启动python脚本,但引发了一条错误消息:找不到包X。进一步注意,我是在基于Debian的Raspbian操作系统上运行这个程序的。
解决方案
首先,您希望在您工作的环境中找到Python库/模块的路径。在我的例子中,脚本位于用户目录下。
为此,在控制台中键入python
,这样您就可以执行以下操作:
>>> import sys
>>> sys.path
它返回一个东西列表,得到第四个应该指向您的站点包。在我的例子中,字符串看起来像那个'/home/pi/.local/lib/python3.9/site-packages'
然后我们将一些东西附加到crontab文件中。通过在终端中键入以下内容,您可以打开crontab:
$ sudo crontab -e
请注意,有两个独立的crontab文件(在我看来)。您可以通过键入crontab的sudo infront来访问其中的一个,而另一个则不能访问它(对于每个用户,我猜是加上根用户)。进一步注意,您可以通过$ (sudo) crontab -l
读取crontab文件。因此,当您打开sudo时,正如我所说的sudo crontab -e
,使用箭头键向下滚动,并在底部创建一个新行,在其中添加以下内容。
*/1 * * * * PYTHONPATH=/home/pi/.local/lib/python3.9/site-packages python /home/pi/script.py
*/1 * * * *
说它应该每分钟运行脚本(只是为了测试)(对此有帮助的指南 )。接下来,我们定义了它应该搜索模块的位置。下一个是不言自明的:使用python打开py-脚本,它位于.
如果要记录脚本中的打印内容,请添加以下最后一点:
*/1 * * * * PYTHONPATH=/home/pi/.local/lib/python3.9/site-packages python /home/pi/script.py >> /var/log/script_output.log 2>&1
实际上,您可以通过交替最后一个目录来添加它应该保存到的任何日志文件。请注意,在运行脚本数月时,此文件可能会大量增长。此外,只在给出的参数之间插入空格(不包括;
),以执行脚本的所有自动执行的crontab文件中的一行。
以保存和关闭crontab文件按Ctrl + X
,然后Y
并点击Enter
,您将返回终端。
摘要
我在根crontab文件中添加了以下内容,可以通过$ sudo crontab -e
访问,以便每分钟执行脚本:
*/1 * * * * PYTHONPATH=/path/to/python/site-packages python /path/to/py-script.py >> /var/log/save_log_here.log 2>&1
使用Python确定指向站点包的路径:
>>> import sys
>>> sys.path
https://stackoverflow.com/questions/42869518
复制相似问题