6

如何从需要使用激活(源 env/bin/active)的 crontab 调用 python 脚本?

4

2 回答 2

18

Virtualenv 的激活脚本非常简单。它主要设置 virtualenv 的 Python 解释器的路径;如果您不在交互式外壳中,则它所做的其他事情(设置PS1、保存旧变量等)实际上并不是必需的。因此,最简单的方法就是使用正确的 Python 解释器启动 Python 脚本,这可以通过以下两种方式之一完成:

1. 设置您的 Python 脚本以使用您的 virtualenv 的 Python 解释器

假设您的 virtualenv 的解释器位于~/virtualenv/bin/python,您可以将该路径放在 Python 脚本的顶部:

#!/home/user/virtualenv/bin/python

然后像往常一样从你的 crontab 启动你的脚本。

2. 在您的 cronjob 中使用正确的 Python 解释器启动脚本

假设你的脚本是 at~/bin/cronjob并且你的 virtualenv 的 Python 解释器是 at ~/virtualenv/python,你可以把它放在你的 crontab 中:

* * * * * /home/user/virtualenv/python /home/user/bin/cronjob
于 2010-05-27T19:37:45.710 回答
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,你不需要运行 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

请注意,生成日志以帮助您查找错误或调试消息非常重要。

于 2012-11-04T23:15:37.210 回答