【发布时间】:2011-02-24 20:07:48
【问题描述】:
如何从需要使用激活的 crontab 调用 python 脚本(源 env/bin/active)?
【问题讨论】:
标签: python crontab virtualenv
如何从需要使用激活的 crontab 调用 python 脚本(源 env/bin/active)?
【问题讨论】:
标签: python crontab virtualenv
Virtualenv 的激活脚本非常简单。它主要设置 virtualenv 的 Python 解释器的路径;如果您不在交互式外壳中,则它所做的其他事情(设置PS1、保存旧变量等)并不是必需的。因此,最简单的方法就是使用正确的 Python 解释器启动您的 Python 脚本,这可以通过以下两种方式之一完成:
1.设置 Python 脚本以使用 virtualenv 的 Python 解释器
假设您的 virtualenv 的解释器位于 ~/virtualenv/bin/python,您可以将该路径放在 Python 脚本的顶部:
#!/home/user/virtualenv/bin/python
然后像往常一样从你的 crontab 启动你的脚本。
2。在您的 cronjob 中使用适当的 Python 解释器启动脚本
假设您的脚本位于 ~/bin/cronjob 并且您的 virtualenv 的 Python 解释器位于 ~/virtualenv/python,您可以将其放在您的 crontab 中:
* * * * * /home/user/virtualenv/python /home/user/bin/cronjob
【讨论】:
$PYTHONPATH 中,这有点难看,但可以通过使用 /usr/bin/env 或类似的方式启动 Python bin 来完成。
我的方法始终是使 crontab 尽可能简单,并处理 crontab 调用的脚本中的所有配置。
1) 创建一个shell脚本:例如/var/webapp/cron.sh
#!/bin/sh
PATH="/var/webapp/.env/bin:$PATH"
export PATH
cd /var/webapp/
python test.py
其中 /var/webapp/.env/bin 是 virtualenv 位置。设置PATH,不需要运行source ../activate
2) 正确设置您的环境。例如,对于 Django 应用程序:
#!/usr/bin/env python
import os
from datetime import datetime
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings.production'
os.environ['DJANGO_CONF'] = 'settings.production'
from util.models import Schedule
dset = Schedule.objects.all()
for rec in dset:
print rec
print 'cron executed %s' % datetime.today()
在本例中,django 设置位于 settings/production.py
3) 最后,编辑 /etc/crontab。例如,每天每半小时执行一次:
1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log
请注意,生成日志以帮助您查找错误或调试消息非常重要。
【讨论】: