2010-11-11 51 views
61

我想設置一個crontab來運行Python腳本。如何爲crontab設置virtualenv?

說劇本是這樣的:

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

有沒有我可以指定爲Python腳本在運行virtualenv中的方法嗎?在殼我只是這樣做:

~$ workon myenv 

有什麼相當於我可以在crontab中激活一個virtualenv嗎?

回答

73

如果您使用的是「workon」,您實際上使用的是位於virtualenv之上的另一個抽象層「virtualenv wrapper」。單獨的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 
+1

我是否還需要使用「#!/ usr/bin/python」來指定我的腳本中的Python解釋器?但是我的藝術家可能會指向一個不同的解釋者。這是我困惑的地方。 – Continuation 2010-11-11 01:33:24

+7

你可能想看看bin/activate在做什麼。激活一個virtualenv基本上只是修改你的PATH env var指向特定版本的命令,比如python等。如果你激活一個virtualenv,然後嘗試運行/ usr/bin/python,你可能會或可能不會使用該版本你的virtualenv期待的python。根據你的PATH,你可以做「#!/ usr/bin/env python」來讓env決定運行哪個python,而不是做「#!/ usr/bin/python」。 – 2010-11-11 01:40:52

+14

就像一個人站起來一樣,不要在你的cron行中嘗試'source',因爲它是一個bashism,因爲cron會使用'/ bin/sh'來執行你的命令,所以它不起作用。 – 2012-10-11 21:05:17

81

爲我的作品還有另一種解決方案...

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

我更喜歡直接使用python從virtualenv中...

+4

這非常有效。實際上,也可以在腳本本身的shebang(aka#!)中放入python解釋器的絕對路徑,當然也可以使腳本可執行。 – 2013-03-22 03:36:20

+0

@AvinashMeetoo是的,這是可能的,但這種方式成爲位置和設置依賴 – Pijusn 2013-08-16 08:25:45

+5

嘗試了這一點,並發現我的腳本無法從同一項目中的其他模塊導入。任何想法爲什麼會發生? – 2014-01-15 23:54:38

8

用bash,你可以創建一個通用的虛擬env包裝,你可以用它來調用任何命令,很像time可以包裝任何命令。

virt_env_wrapper.bash

#!/bin/bash  
source path/to/virtual/env/bin/activate 
"[email protected]" 

擊的魔法咒語"[email protected]"重新逃逸的原始命令行上的所有標記,這樣,如果你要調用:

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

foo.py將看到的['bar', 'baz blap']

一個 sys.argv