Python 巨蟒、靓汤和cron
我正在尝试使用Python和BeautifulSoup来废弃一个网站。使用Python 巨蟒、靓汤和cron,python,linux,cron,beautifulsoup,Python,Linux,Cron,Beautifulsoup,我正在尝试使用Python和BeautifulSoup来废弃一个网站。使用python update.py从终端上运行脚本非常好。正如相同的update.py所建议的那样,我希望每天运行这个。似乎是cron的工作,而不是手动运行它 但是,当我尝试将其作为cron作业运行时,会出现以下错误: Traceback (most recent call last): File "/home/me/documents/blotter/update.py", line 121, in <mod
python update.py
从终端上运行脚本非常好。正如相同的update.py
所建议的那样,我希望每天运行这个。似乎是cron的工作,而不是手动运行它
但是,当我尝试将其作为cron作业运行时,会出现以下错误:
Traceback (most recent call last):
File "/home/me/documents/blotter/update.py", line 121, in <module>
getDailyLog(yday.month, yday.day, yday.year)
File "/home/me/documents/blotter/update.py", line 103, in getDailyLog
note = cleanNote(cells[7], month, day, year, dispatchNumber)
File "/home/me/documents/blotter/update.py", line 57, in cleanNote
rows = detailTable.find_all("tr")
AttributeError: 'NoneType' object has no attribute 'find_all'
回溯(最近一次呼叫最后一次):
文件“/home/me/documents/blotter/update.py”,第121行,在
getDailyLog(yday.month、yday.day、yday.year)
文件“/home/me/documents/blotter/update.py”,第103行,在getDailyLog中
注释=干净注释(单元格[7],月,日,年,调度编号)
cleanNote中的文件“/home/me/documents/blotter/update.py”,第57行
行=详细表。全部查找(“tr”)
AttributeError:“非类型”对象没有“全部查找”属性
我理解错误消息(detailTable不是soup对象,因此没有属性find\u all
)。如果这是个问题,我可以调试它,但是脚本可以在完全相同的URL上从终端正常运行。这似乎表明问题不在于脚本
错误是在我使用Beautiful Soup无误地获取汇总表之后出现的。它试图在函数cleanNote
中获取详细信息表。这让我觉得cron和BeautifulSoup之间并没有什么问题
在cron作业中,什么可能会导致在命令行上运行的程序崩溃
编辑:仍然不清楚为什么它今天早些时候从命令行同时运行时会崩溃,没有出现问题,但cron作业现在似乎正在正确执行,没有出现错误。我没有做任何改变,只是把工作安排在下午晚些时候,效果很好 通常,
cron
作业在一个shell中执行,该shell不提供任何“登录”文件:~/.profile
,~/.login
,~/.kshrc
,等等
如果看不到crontab-l
(以及您的登录脚本)的输出,就不可能知道,但我猜您的脚本在交互式登录环境中需要一些东西。通常的嫌疑犯包括:
- 默认的
环境变量查找的PATH
版本与您在命令行中使用的版本不同python
- 您的
、PYTHONHOME
或PYTHONPATH
环境变量包含您所依赖的内容PYTHONSTARTUP
- 您的交互式shell将“python”别名为其他内容
- 您一直在
或virtualenv
中运行脚本,当您从venv
运行脚本时,该脚本不处于活动状态cron
- 脚本取决于当前工作目录中的某些内容
python-E update.py
,查看忽略各种python*
环境变量时会发生什么。您还可以尝试-s
和-s
选项---查看python
手册页了解更多信息。或者使用脚本的绝对路径名从其他目录调用脚本
如果问题只是缺少一个环境变量,则可以更改cron
条目以显式设置它:
***env VAR=something python/path/to/update.py
或者对于不同的口译员:
***/path/to/python8.e.planks-constant/path/to/update.py
对于更复杂的设置,大多数人编写前端shell脚本来配置所需的环境,然后运行您真正想要的脚本:
***/path/to/update.sh
…其中
update.sh
充满了cd
,export
,可能还有source
语句。这两个版本中的解释器和包版本相同?您是否捕获并忽略了错误detailTable
不应该是None
,除非发生了错误,并且在运行过程中应该会出现错误或异常以及更多详细信息。Padraic,运行之间的所有内容都相同。tdelaney,我现在没有处理任何错误/异常。我感到困惑,因为没有任何更改的同一个脚本在cron中失败,但在命令行上工作。detailTable
在应该是BS对象时是None
,所以代码前面出现了一些错误。你想回到什么地方出了问题来诊断问题。BS和urllib2(如果您正在使用的话)通常在出现问题时引发异常。也许detailTable
应该在if
子句的某个地方设置,但是您没有将else
作为错误处理,因此它从未被分配。但关键是,看看应该在哪里设置detailTable
,然后再从那里开始。我以前在其他任务中使用过您描述的解决方案(update.sh
,它将一切都安排好),但在编写Python时考虑到了cron。我没有使用相对路径或其他可能导致麻烦的东西。我不确定这里出了什么问题,但似乎从午饭到现在已经解决了。