从crontab调用带激活的python脚本

6 投票
2 回答
6212 浏览
提问于 2025-04-15 23:15

我该怎么从crontab里调用一个需要激活环境的Python脚本呢?比如说,得先用命令(source env/bin/activate)来激活环境。

2 个回答

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 是虚拟环境的位置。设置好 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

注意,生成日志是很重要的,这样可以帮助你找到错误或调试信息。

17

Virtualenv的激活脚本其实很简单。它主要是设置你虚拟环境的Python解释器的路径;其他一些操作,比如设置PS1、保存旧变量等等,如果你不是在交互式的命令行中,这些其实都不是必须的。所以最简单的方法就是直接用正确的Python解释器来运行你的Python脚本,这可以通过两种方式来实现:

1. 设置你的Python脚本使用虚拟环境的Python解释器

假设你的虚拟环境的解释器在~/virtualenv/bin/python,你可以在你的Python脚本的最上面加上这个路径:

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

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

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

假设你的脚本在~/bin/cronjob,而你的虚拟环境的Python解释器在~/virtualenv/python,你可以在你的crontab中写上这个:

* * * * * /home/user/virtualenv/python /home/user/bin/cronjob

撰写回答