Python 巨蟒、靓汤和cron

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和BeautifulSoup来废弃一个网站。使用
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。我没有使用相对路径或其他可能导致麻烦的东西。我不确定这里出了什么问题,但似乎从午饭到现在已经解决了。