79

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

说脚本是这样的:

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

有没有办法可以为该 Python 脚本指定一个 virtualenv 来运行?在 shell 中我会这样做:

~$ workon myenv

我可以在 crontab 中做一些等效的事情来激活 virtualenv 吗?

4

4 回答 4

118

另一个适合我的解决方案...

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

我更喜欢直接从 virtualenv 中使用 python ...

于 2012-10-11T21:00:20.643 回答
84

如果您使用的是“workon”,那么您实际上是在使用“virtualenv wrapper”,它是位于 virtualenv 之上的另一层抽象。单独的 virtualenv 可以通过 cd'ing 到您的 virtualenv 根目录并运行来激活:

source bin/activate

workon 是由 virtualenv 包装器提供的命令,而不是 virtualenv,它执行了一些普通 virtualenv 不一定需要的额外内容。你真正需要做的就是在你的 virtualenv 根目录中获取 bin/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
于 2010-11-11T01:28:18.510 回答
9

使用 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']

于 2015-05-13T18:04:38.900 回答
0

我不确定workon,但对于venv. 唯一要记住的是默认情况下crontab使用,而不是,所以你需要使用命令而不是。shbash.source

如果您有文件,以下是示例~/myproject/main.py

* * * * * cd ~/myproject && . .venv/bin/activate && python main.py > /tmp/out1 2>&1

也可以直接调用pythonvenv 目录下的具体路径,就不需要调用activate.

* * * * * ~/myproject/.venv/bin/python ~/myproject/main.py > /tmp/out2 2>&1

这样做的缺点是您需要两次指定项目路径,这使得维护更加棘手。为避免这种情况,您可以使用 shell 变量,这样您只需指定一次项目路径:

* * * * * project_dir=~/myproject ; $project_dir/.venv/bin/python $project_dir/main.py > /tmp/out3 2>&1
于 2021-09-02T22:34:24.260 回答