如何为crontab设置virtualenv?


76

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

说脚本是这样的:

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

有什么办法可以指定要在其中运行的Python脚本的virtualenv吗?在外壳中,我只想做:

~$ workon myenv

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

Answers:


83

如果使用“ workon”,则实际上是在使用“ virtualenv包装器”,这是位于virtualenv之上的另一层抽象。可以通过将CD转到您的virtualenv根目录并运行以下命令来激活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

1
我仍然需要使用“#!/ usr / bin / python”在脚本中指定我的Python解释器吗?但是我的virtualenv可能指向其他解释器。这就是我感到困惑的地方。
延续

7
您可能想看看bin / activate在做什么。激活virtualenv基本上只是修改PATH env var以指向特定版本的命令,例如python等。如果激活virtualenv,然后尝试运行/ usr / bin / python,则可能会或可能不会使用该版本您的virtualenv期望的python版本。不用执行“#!/ usr / bin / python”,而是可以执行“#!/ usr / bin / env python”,让env根据您的PATH决定运行哪个python。
安迪·怀特2010年

15
提起注意,请勿尝试source在cron行中进行操作,因为它是一种bashism,因此将无法正常工作,因为cron将用于/bin/sh执行您的命令。
Burhan Khalid 2012年

1
确保#!/ bin / bash也是文件中的第一行,之前没有空格
dnfehren 2014年

1
并非所有workon都源bin / activate文件。Virtualenvwrapper还具有您可以使用的钩子(例如,postactivate),如果您仅提供激活文件,则该钩子将不会运行。
seddonym 2015年

112

另一种对我有效的解决方案...

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

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


4
这真的很好。实际上,也可以将python解释器的绝对路径放在脚本本身的shebang(aka#!)中,当然,并使该脚本可执行。
Avinash Meetoo

@AvinashMeetoo是的,有可能,但是通过这种方式,它变得依赖于位置和设置
Pijusn

6
进行了尝试,发现我的脚本无法从同一项目中的其他模块导入。有什么想法可能会发生这种情况吗?
内森·古尔德

@NathanGo您可能需要按照此处的指示在.pth虚拟环境中添加具有virtual_env_folder/lib/python3.3/site-packages/app_name.pth应用程序位置的文件stackoverflow.com/a/10739838/1082673
lukik 2014年

1
这是更好的解决方案
Nyxynyx

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.