简介
在BAE Python Web部署中,通过crond定时执行Python脚本时,可能触发定时任务异常。本文主要介绍异常产生原因及解决方案。关于crond使用方法,请参考以下链接:
异常现象
以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增加权限验证。