如何为crontab设置virtualenv?

84 投票
4 回答
53611 浏览
提问于 2025-04-16 06:53

我想设置一个定时任务,让一个Python脚本自动运行。

假设这个脚本大概是这样的:

#!/usr/bin/python
print "hello world"

有没有办法让我指定一个虚拟环境,让这个Python脚本在里面运行呢?在命令行里,我只需要这样做:

~$ workon myenv

在定时任务中,有什么类似的方式可以激活这个虚拟环境吗?

4 个回答

10

在bash中,你可以创建一个通用的虚拟环境包装器,这样你就可以用它来执行任何命令,就像time可以包装任何命令一样。

virt_env_wrapper.bash:

#!/bin/bash    
source path/to/virtual/env/bin/activate
"$@"

Bash中的神奇符号"$@"会重新处理原始命令行中的所有参数,这样如果你执行:

virt_env_wrapper.bash python foo.py bar 'baz blap'

foo.py就会看到sys.argv的内容是['bar', 'baz blap']

122

有没有什么方法可以在crontab中激活一个虚拟环境?

这个方法对我来说很有效……

## call virtualenv python from crontab
0    9    *    *    *    /path/to/virtenv/bin/python /path/to/your_cron_script.py

我更喜欢直接从虚拟环境中使用python,而不是把虚拟环境的路径写死在脚本的开头部分,也就是不想在脚本里直接指定虚拟环境的路径,或者去执行虚拟环境的激活命令。

84

如果你在使用“workon”,其实是在使用“virtualenv wrapper”,这是一种在virtualenv之上的额外工具。单独使用virtualenv时,你需要先进入你的虚拟环境根目录,然后运行:

source bin/activate

workon是virtualenv wrapper提供的一个命令,而不是virtualenv本身的。它做了一些额外的事情,这些事情对于普通的virtualenv来说并不是必须的。实际上,你只需要在虚拟环境的根目录下运行bin/activate文件,就可以“激活”这个虚拟环境。

你可以设置你的crontab来调用一个bash脚本,来完成这个操作:

#! /bin/bash    
cd my/virtual/env/root/dir
source bin/activate

# virtualenv is now active, which means your PATH has been modified.
# Don't try to run python from /usr/bin/python, just run "python" and
# let the PATH figure out which version to run (based on what your
# virtualenv has configured).

python myScript.py

撰写回答