2010-11-11 4 views
61

Я хочу создать crontab для запуска скрипта Python.Как установить virtualenv для crontab?

Say сценарий что-то вроде:

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

Есть ли способ, которым я мог бы указать virtualenv для этого сценария Python для запуска в? В оболочке я бы просто сделать:

~$ workon myenv 

Есть ли что-то эквивалент я мог бы сделать в кронтаб, чтобы активировать virtualenv?

ответ

73

Если вы используете «workon», вы на самом деле используете «virtualenv wrapper», который является еще одним слоем абстракции, который находится поверх виртуального. virtualenv только может быть активирована cd'ing к вашему virtualenv корневой директории и запуску:

source bin/activate 

workon является команда обеспечивается virtualenv обертки, не virtualenv, и это делает некоторые дополнительные вещи, которые не обязательно требуются для обычного virtualenv , Все, что вам действительно нужно сделать, это запустить файл bin/activate в вашем корневом каталоге virtualenv, чтобы «активировать» virtualenv.

Вы можете настроить ваш кронтаб для вызова Баш скрипт, который делает это:

#! /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 может указывать на другого переводчика. Здесь я смущен. – Continuation

+7

Возможно, вы захотите взглянуть на то, что делает bin/activate. Активация virtualenv в основном просто изменяет ваш PATH env var, чтобы указать на определенные версии команд, например, на python и т. Д. Если вы активируете virtualenv, попробуйте запустить/usr/bin/python, вы можете или не можете использовать версию python, который ожидает ваш virtualenv. Вместо того, чтобы делать «#!/Usr/bin/python», вы можете сделать «#!/Usr/bin/env python», чтобы позволить env решить, какой python запускаться, на основе вашего PATH. –

+14

Как хэдз-ап, не пытайтесь использовать 'source' в своей линии cron, как его багизм и не будет работать, поскольку cron будет использовать'/bin/sh' для выполнения вашей команды. –

81

Другое решение, которое работает хорошо для меня ...

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

Я предпочитаю использовать Python непосредственно из virtualenv ...

+4

Это работает очень хорошо. Фактически, можно также установить абсолютный путь к интерпретатору python в shebang (aka #!) Самого скрипта и, конечно же, сделать исполняемый файл сценария. –

+0

@AvinashMeetoo Да, это возможно, но таким образом он становится зависимым от местоположения и настройки – Pijusn

+5

Пробовал это и обнаружил, что мой скрипт не может импортировать из других модулей в том же проекте. Любые идеи, почему это может произойти? –

8

С помощью bash вы можете создать общую виртуальную оболочку env, которую вы можете использовать для вызова любой команда, очень похоже на то, как time может обернуть любую команду.

virt_env_wrapper.bash:

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

Bash волшебно колдовство "[email protected]" повторно ускользает все маркеры на исходной командной строке, так что если вы должны были вызвать:

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

foo.py бы увидеть sys.argv из ['bar', 'baz blap']

 Смежные вопросы

  • Нет связанных вопросов^_^