Wie stelle ich virtualenv für eine Crontab ein?

74

Ich möchte eine Crontab einrichten, um ein Python-Skript auszuführen.

Angenommen, das Skript ist so etwas wie:

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

Gibt es eine Möglichkeit, eine virtuelle Umgebung anzugeben, in der das Python-Skript ausgeführt werden soll? In der Shell würde ich einfach tun:

~$ workon myenv

Gibt es etwas Äquivalentes, das ich in crontab tun könnte, um eine virtuelle Umgebung zu aktivieren?

Fortsetzung
quelle

Antworten:

82

Wenn Sie "workon" verwenden, verwenden Sie tatsächlich "virtualenv wrapper", eine weitere Abstraktionsebene, die über virtualenv liegt. virtualenv allein kann aktiviert werden, indem Sie in Ihr virtualenv-Stammverzeichnis wechseln und Folgendes ausführen:

source bin/activate

workon ist ein Befehl, der vom virtualenv-Wrapper bereitgestellt wird, nicht von virtualenv, und er führt einige zusätzliche Dinge aus, die für einfaches virtualenv nicht unbedingt erforderlich sind. Alles, was Sie wirklich tun müssen, ist, die bin / enabled-Datei in Ihrem virtualenv-Stammverzeichnis zu quellen, um eine virtualenv zu "aktivieren".

Sie können Ihre Crontab so einrichten, dass sie ein Bash-Skript aufruft, das Folgendes ausführt:

#! /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
Andy White
quelle
1
Muss ich immer noch "#! / Usr / bin / python" verwenden, um meinen Python-Interpreter in meinem Skript anzugeben? Aber meine virtuelle Umgebung könnte auf einen anderen Interpreter verweisen. Hier bin ich verwirrt.
Fortsetzung
7
Vielleicht möchten Sie einen Blick darauf werfen, was bin / enable tut. Das Aktivieren einer virtuellen Umgebung bedeutet im Grunde nur, Ihre PATH env var so zu ändern, dass sie auf bestimmte Versionen von Befehlen wie Python usw. verweist. Wenn Sie eine virtuelle Umgebung aktivieren, versuchen Sie, / usr / bin / python auszuführen, und verwenden Sie möglicherweise die Version von Python, das Ihre virtuelle Umgebung erwartet. Anstatt "#! / Usr / bin / python" auszuführen, können Sie "#! / Usr / bin / env python" ausführen, damit die env basierend auf Ihrem PATH entscheiden kann, welche Python ausgeführt werden soll.
Andy White
15
Versuchen sourceSie es nicht als Heads-up in Ihrer Cron-Zeile, da dies ein Bashismus ist und nicht funktioniert, da Cron /bin/shIhren Befehl ausführt.
Burhan Khalid
1
Stellen Sie sicher, dass die #! / bin / bash ist auch die allererste Zeile in der Datei, kein Leerzeichen davor
dnfehren
1
Es ist nicht wahr, dass alles, was Workon tut, die Bin / Activate-Datei als Quelle ist. Virtualenvwrapper verfügt auch über Hooks, die Sie verwenden können (z. B. nachaktivieren) und die nicht ausgeführt werden, wenn Sie nur die Aktivierungsdatei als Quelle verwenden.
Seddonym
108

Eine andere Lösung, die für mich gut funktioniert ...

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

Ich bevorzuge die Verwendung von Python direkt aus der virtuellen Umgebung ...

Mike Pennington
quelle
4
Das funktioniert wirklich gut. Tatsächlich ist es auch möglich, den absoluten Pfad zum Python-Interpreter in den Shebang (auch bekannt als #!) Des Skripts selbst zu setzen und das Skript natürlich ausführbar zu machen.
Avinash Meetoo
@ AvashashMeetoo Ja, es ist möglich, aber auf diese Weise wird es orts- und
einrichtungsabhängig
6
Versuchte dies und stellte fest, dass mein Skript nicht aus anderen Modulen im selben Projekt importiert werden konnte. Irgendwelche Ideen, warum das passieren könnte?
Nathan Gould
@ NathanGould mussten Sie wahrscheinlich eine .pthDatei in Ihrer virtuellen Umgebung virtual_env_folder/lib/python3.3/site-packages/app_name.pthmit dem Speicherort Ihrer App hinzufügen,
lukik
1
Dies ist die bessere Lösung
Nyxynyx
9

Mit bash können Sie einen generischen virtuellen env-Wrapper erstellen, mit dem Sie einen beliebigen Befehl aufrufen können , ähnlich wie Sie timeeinen Befehl umschließen können.

virt_env_wrapper.bash::

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

Bashs magische Beschwörung "$@"entgeht allen Token auf der ursprünglichen Befehlszeile, sodass Sie Folgendes aufrufen können:

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

foo.pywürde ein sys.argvvon sehen['bar', 'baz blap']

Ross Rogers
quelle