如何从crontab调用需要使用activate(source env / bin / active)的python脚本?
答案 0 :(得分:17)
Virtualenv的激活脚本非常简单。它主要设置了virtualenv的Python解释器的路径;如果你不在交互式shell中,那么它所做的其他事情(设置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
答案 1 :(得分:1)
我的方法始终是让 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,您不需要运行源../ 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
请注意,生成日志以帮助您查找错误或调试消息非常重要。