Как установить virtualenv для crontab?

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

Скажем, сценарий выглядит примерно так:

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

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

~$ workon myenv

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


person Continuation    schedule 11.11.2010    source источник


Ответы (3)


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

source bin/activate

workon - это команда, предоставляемая оболочкой virtualenv, а не virtualenv, и она выполняет некоторые дополнительные функции, которые не обязательно требуются для простого virtualenv. Все, что вам действительно нужно сделать, это создать файл bin / activate в корневом каталоге virtualenv, чтобы «активировать» 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
person Andy White    schedule 11.11.2010
comment
Мне все еще нужно использовать #! / Usr / bin / python, чтобы указать мой интерпретатор Python в моем скрипте? Но мой virtualenv может указывать на другого интерпретатора. Вот где я запутался. - person Continuation; 11.11.2010
comment
Вы можете посмотреть, что делает bin / activate. Активация virtualenv в основном просто изменяет ваш PATH env var, чтобы указывать на определенные версии команд, такие как python и т. Д. Если вы активируете virtualenv, попробуйте запустить / usr / bin / python, вы можете или не можете использовать версию Python, который ожидает ваш virtualenv. Вместо #! / Usr / bin / python вы можете сделать #! / Usr / bin / env python, чтобы позволить env решить, какой питон запускать, на основе вашего PATH. - person Andy White; 11.11.2010
comment
В качестве предупреждения не пытайтесь использовать source в строке cron, так как это заблуждение и не сработает, поскольку cron будет использовать /bin/sh для выполнения вашей команды. - person Burhan Khalid; 12.10.2012
comment
убедитесь, что #! / bin / bash - это также самая первая строка в файле, без пробелов перед ней - person dnfehren; 05.08.2014
comment
Неверно, что вся работа - это источник файла bin / activate. В Virtualenvwrapper также есть хуки, которые вы можете использовать (например, postactivate), которые не будут запущены, если вы просто загрузите файл активации. - person seddonym; 21.12.2015
comment
Используйте этот скрипт, если используете какие-либо настраиваемые шаблоны электронной почты, настраиваемые пути, потому что проверка будет очень простой и масштабируемой. - person Yash; 20.10.2016

Еще одно решение, которое мне подходит ...

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

Я предпочитаю использовать python прямо из virtualenv ...

person This    schedule 11.10.2012
comment
Это действительно хорошо работает. Фактически, также можно поместить абсолютный путь к интерпретатору python в shebang (он же #!) Самого скрипта и, конечно же, сделать скрипт исполняемым. - person Avinash Meetoo; 22.03.2013
comment
@AvinashMeetoo Да, это возможно, но в этом случае это становится зависимым от местоположения и настройки - person Pijusn; 16.08.2013
comment
Попробовал и обнаружил, что мой скрипт не может импортировать из других модулей того же проекта. Есть идеи, почему это могло произойти? - person Nathan Gould; 16.01.2014
comment
@NathanG Возможно, вам нужно было добавить .pth файл в вашу виртуальную среду virtual_env_folder/lib/python3.3/site-packages/app_name.pth с указанием местоположения вашего приложения, как указано здесь stackoverflow.com/a/ 10739838/1082673 - person lukik; 19.08.2014
comment
pyvenv-3.3 в Ubuntu 13.10 и в Debian есть ошибки. См. ошибку 1093193 и ошибка 1298831 и просмотрите причина и обходной путь (просто добавьте символическую ссылку venvdir/lib/python3.3/dist-packages, указывающую на site-packages) - person Denilson Sá Maia; 26.09.2014
comment
Это лучшее решение - person Nyxynyx; 31.05.2017
comment
Что, черт возьми, такое 0 9 * * * Можете ли вы объяснить эту нотацию, я пришел к этому сообщению из анонимного сообщения crontab. - person user1767754; 19.11.2017
comment
@ user1767754, см. man 5 crontab - person This; 30.11.2018

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

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

person Ross Rogers    schedule 13.05.2015