如何为crontab设置virtualenv?

我想设置一个crontab来运行一个Python脚本。

说脚本是这样的:

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

有没有一种方法可以指定一个virtualenv的Python脚本运行? 在shell中我只是做:

 ~$ workon myenv 

有什么相当于我可以在crontab中激活一个virtualenv?

如果你正在使用“workon”,你实际上使用的是“virtualenv wrapper”,它是位于virtualenv之上的另一个抽象层。 单独使用virtualenv可以通过cd到你的virtualenv根目录并运行:

 source bin/activate 

workon是一个由virtualenv包装器提供的命令,不是virtualenv,它还有一些额外的东西,对于普通的virtualenv来说不是必需的。 你真正需要做的就是在你的virtualenv根目录下findbin / activate文件来激活一个virtualenv。

你可以设置你的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 

另一种解决scheme对我来说效果很好

 0 9 * * * /path/to/virtenv/bin/python /path/to/cron_script.py 

我更喜欢直接从virtualenv使用Python …

使用bash,你可以创build一个通用的虚拟env包装器,你可以使用它来调用任何命令,就像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会看到['bar', 'baz blap']sys.argv