【BAE基础版】在Python Web中增加定时任务运行Python脚本

  • 简介

在BAE Python Web部署中,通过crond定时执行Python脚本时,可能触发定时任务异常。本文主要介绍异常产生原因及解决方案。关于crond使用方法,请参考以下链接:

https://bce.baidu.com/doc/BAE/GUIGettingStarted.html#.E9.85.8D.E7.BD.AEapp.conf

  • 异常现象

以Python Web中的mongo操作为例,配置app.conf,定时执行mongo db操作脚本。(脚本来源:Pyhon连接MongoDB

#-*- coding:utf-8 -*-

import pymongo
from pymongo import MongoClient

def test_mongo():
    ### 连接MongoDB服务
    ### 从管理控制台获取host, port, db_name, api_key, secret_key
    con = MongoClient("mongo.duapp.com", 8908)
    db_name = "CAoKTghXtKNEGBaLAYRj" # 数据库名称
    db = con[db_name]
    api_key = "1df5f7da3c5c48559f34589d83126c6c" # 用户AK
    secret_key = "566417acbb6349a98a09cd6f5edbb402" # 用户SK
    db.authenticate(api_key, secret_key)

    ### 插入数据到集合test
    collection_name = 'test'
    db[collection_name].insert({"id":10, 'value':"test test"})

    ### 查询集合test
    cursor = db[collection_name].find()
    con.close()
    return "select collection test %s"%str(cursor[0])

test_mongo()

将以上脚本保存在根目录/home/bae/app/mongo.py,并配置app.conf,增加定时任务,定时执行mongo db操作:

crond :
  service : on
  crontab :
    - "* * * * * python /home/bae/app/mongo.py 1>/dev/null 2>>/home/bae/log/mongo.error.log"

部署成功后,我们发现该mongo db的collection中并没有新的记录插入,开通port服务ssh登录到该实例上(参考BAE基础版Port服务),mongo.error.log中的信息显示如下:

Traceback (most recent call last):
  File "/home/bae/app/mongo.py", line 3, in
    import pymongo
ImportError: No module named pymongo

以上error信息说明在Python Web的定时脚本中运行用户的Python脚本时,无法加载用户自定义的pymongo依赖包。

  • 问题原因

导致该问题的原因如下:

用户自定义依赖配置文件requirements.txt,用于配置编译时的依赖包。开发者部署代码时,requirements.txt中指定的依赖包会下载安装到应用根目录: /home/bae/app/deps (可参考Python部署文件中requirements.txt的说明)。在Python Web中已将 ”/home/bae/app/deps” 添加到Python默认的模块搜索路径,而定时任务并没有添加该目录到默认的模块搜索路径中。

  • 解决方案

在定时任务运行的python脚本中,将”/home/bae/app/deps”添加到Python默认的模块搜索路径中。

方案一,在python脚本mongo.py的开头为Python添加默认模块搜索路径如下:

import sys
sys.path.append('/home/bae/app/deps')

方案二,将需要Python运行的定时任务封装成api,在定时任务中curl该api。同时需要注意为该api增加权限验证。

此条目发表在 未分类 分类目录。将固定链接加入收藏夹。

发表评论