如何为crontab设置virtualenv?

Con*_*ion 69 python cron virtualenv virtualenvwrapper

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

说脚本是这样的:

#!/usr/bin/python
print "hello world"
Run Code Online (Sandbox Code Playgroud)

有没有办法为这个Python脚本指定一个virtualenv来运行?在shell中,我只是这样做:

~$ workon myenv
Run Code Online (Sandbox Code Playgroud)

我可以在crontab中做些什么来激活virtualenv吗?

Mik*_*ton 97

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

0    9    *    *    *    /path/to/virtenv/bin/python /path/to/cron_script.py
Run Code Online (Sandbox Code Playgroud)

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

  • 试过这个,发现我的脚本无法从同一项目中的其他模块导入.任何想法为什么会发生? (5认同)
  • 这非常有效.实际上,也可以将python解释器的绝对路径放在脚本本身的shebang(又名#!)中,当然,也可以使脚本可执行. (4认同)

And*_*ite 82

如果您正在使用"workon",那么您实际上正在使用"virtualenv wrapper",这是另一层位于virtualenv之上的抽象层.可以通过cd到你的virtualenv根目录并运行来激活virtualenv:

source bin/activate
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 就像一个抬头一样,不要在你的cron行中尝试`source`,因为它是一种基础并且不会起作用,因为cron将使用`/ bin/sh`来执行你的命令. (15认同)
  • 您可能想看看bin/activate正在做什么.激活virtualenv基本上只是修改你的PATH env var以指向特定版本的命令,比如python等.如果你激活virtualenv,然后尝试运行/ usr/bin/python,你可能会也可能不会使用该版本您的virtualenv期待的python.您可以执行"#!/ usr/bin/env python"来让env根据您的PATH决定运行哪个python,而不是执行"#!/ usr/bin/python". (7认同)
  • 我是否仍然需要使用“#!/usr/bin/python”在我的脚本中指定我的 Python 解释器?但是我的 virtualenv 可能指向不同的解释器。这是我感到困惑的地方。 (2认同)
  • 确保#! /bin/bash 也是文件中的第一行,前面没有空格 (2认同)

Ros*_*ers 8

使用bash,您可以创建一个通用的虚拟环境包装器,您可以使用它来调用任何命令,就像time包装任何命令一样.

virt_env_wrapper.bash:

#!/bin/bash    
source path/to/virtual/env/bin/activate
"$@"
Run Code Online (Sandbox Code Playgroud)

Bash的魔法咒语"$@"重新逃脱原始命令行上的所有令牌,这样如果你要调用:

virt_env_wrapper.bash python foo.py bar 'baz blap'
Run Code Online (Sandbox Code Playgroud)

foo.py将看到sys.argv['bar', 'baz blap']