如何从需要使用激活(源 env/bin/active)的 crontab 调用 python 脚本?
2 回答
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
我的方法始终是使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
请注意,生成日志以帮助您查找错误或调试消息非常重要。