Як встановити virtualenv для crontab?


76

Я хочу встановити crontab для запуску сценарію Python.

Скажімо, сценарій приблизно такий:

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

Чи є спосіб, яким я можу вказати virtualenv для запуску цього сценарію Python? В оболонці я б просто зробив:

~$ workon myenv

Чи є щось еквівалентне, що я міг би зробити у crontab для активації virtualenv?

Відповіді:


83

Якщо ви використовуєте "workon", ви насправді використовуєте "обгортку virtualenv", яка є ще одним шаром абстракції, який знаходиться поверх virtualenv. virtualenv поодинці можна активувати за допомогою cd'ing до вашого кореневого каталогу 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

1
Чи все-таки мені потрібно використовувати "#! / Usr / bin / python", щоб вказати мій інтерпретатор Python у своєму сценарії? Але мій virtualenv може вказати на іншого тлумача. Тут я розгублений.
Продовження

7
Можливо, ви захочете поглянути, що робить bin / activate. Активізація virtualenv - це, в основному, просто модифікація вашої PATH env var, щоб вказувати на конкретні версії команд, наприклад, python тощо. Якщо ви активуєте virtualenv, спробуйте запустити / usr / bin / python, ви можете або не використовувати версію python, якого очікує ваш віртуаленв. Замість того, щоб робити "#! / Usr / bin / python", ви можете зробити "#! / Usr / bin / env python", щоб env вирішив, який пітон запускати, на основі вашого PATH.
Енді Уайт,

15
Так само, як голова, не намагайтеся sourceввести рядок cron, оскільки це башизм і не буде працювати, оскільки cron буде використовувати /bin/shдля виконання вашої команди.
Бурхан Халід,

1
переконайтеся, що #! / bin / bash - це також перший рядок у файлі, перед ним немає пробілів
dnfehren

1
Невірно, що все, що робить workon, - це джерело файлу bin / activate. Virtualenvwrapper також має гачки, якими ви можете скористатися (наприклад, postactivate), які не запускатимуться, якщо ви просто отримаєте файл активації.
седдонім

112

Ще одне рішення, яке мені добре підходить ...

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

Я вважаю за краще використовувати python безпосередньо з virtualenv ...


4
Це працює дуже добре. Насправді також можна поставити абсолютний шлях до інтерпретатора python в shebang (він же #!) Самого сценарію і, звичайно, зробити сценарій виконуваним.
Avinash Meetoo

@AvinashMeetoo Так, це можливо, але таким чином це стає
залежним від

6
Спробував це і виявив, що мій сценарій не може імпортувати з інших модулів того самого проекту. Будь-які ідеї, чому це може статися?
Nathan Gould

@NathanGould ви , ймовірно , необхідно додати .pthфайл у віртуальному середовищі virtual_env_folder/lib/python3.3/site-packages/app_name.pthз місцем розташування вашого застосування , як зазначено тут stackoverflow.com/a/10739838/1082673
lukik

1
Це найкраще рішення
Nyxynyx

9

За допомогою bash ви можете створити загальну віртуальну обгортку env, яку можна використовувати для виклику будь-якої команди, подібно до того, як timeможна обгортати будь-яку команду.

virt_env_wrapper.bash:

#!/bin/bash    
source path/to/virtual/env/bin/activate
"$@"

Чарівне заклинання Баша "$@"повторно виводить усі маркери з початкового командного рядка, так що якщо ви мали б викликати

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

foo.pyпобачили б sys.argvз['bar', 'baz blap']

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.