2010-05-27 77 views

回答

15

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/crontab 
+0

easy_install库的路径怎么样? – Timmy 2010-05-27 19:58:08

+2

如果它们也安装在虚拟环境中或“全局”站点包目录中,则应该找到它们;否则,你将不得不把它们放在你的'$ PYTHONPATH'中,它有点丑,但是可​​以通过'/ usr/bin/env'或者其他来启动Python bin来完成。 – mipadi 2010-05-27 20:09:44

+1

最后的代码块应该可能以“/ home/bin/cronjob”结尾 – 2010-08-06 22:06:59

1

我的方法是始终保持crontab尽可能简单,并且处理由crontab调用的脚本中的所有配置。

1)创建一个外壳脚本:例如/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的设置位于设置/ production.py

3)最后,编辑/ etc/crontab中。例如,要执行每半小时,每一天:

1,31 * * * * root /var/webapp/cron.sh >> /var/webapp/cron.log 

注意,重要的是要生成日志,以帮助您发现错误或调试消息。