Exécuter périodiquement un script python avec cron dans un environnement venv

Pour enregistrer un travail python dans cron et l'exécuter périodiquement dans un environnement venv

Conclusion

Vous pouvez utiliser python dans l'environnement venv que vous souhaitez utiliser.

$ crontab -e
* * * * * cd [Chemin absolu]; venv/bin/python foo.py

Exemple concret

Je veux écrire la date et l'heure dans un fichier au format jsonline une fois par minute.

Environnement OS

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G87

Créez un répertoire, créez un environnement virtuel venv et installez le package jsonlines utilisé cette fois.

$ mkdir [endroit]
$ cd [endroit]
$ python -V
Python 3.7.1
$ python -m venv venv
$ source venv/bin/activate
(venv) $ pip install jsonlines

Écrivez un script python. La date et l'heure du traitement sont écrites sous la forme jsonline dans out.jsonl. Imprimez également pour confirmation.

dt2jsonl.py


import datetime
import jsonlines

dt = datetime.datetime.now()
dict_now = {'date': str(dt.date()), 'time': str(dt.time())}

with jsonlines.open('out.jsonl', mode='a') as writer:
    writer.write(dict_now)

print('updated: '+ str(dt))

Une fois traitée, la sortie ressemble à ceci.

(venv) $ python dt2jsonl.py
updated: 2020-01-26 17:39:23.435616
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}

Essayez de vous inscrire avec cron en tant que python dt2jsonl.py. Puisqu'il s'agit de «* * * * *», il doit être traité une fois par minute. Écrivez stderr et stdout dans /tmp/cron.log avec >> /tmp/cron.log 2> & 1 pour vérifier l'erreur et afficher le résultat.

(venv) $ crontab -e
* * * * * python dt2jsonl.py >> /tmp/cron.log 2>&1

En attendant, il y a une erreur dans / tmp / cron.log

(venv) $ tail -f /tmp/cron.log
python: can't open file 'dt2jsonl.py': [Errno 2] No such file or directory

Il semble que dt2jsonl.py ne puisse pas être trouvé, alors vérifiez où se trouve le cron.

(venv) $ crontab -e
* * * * * pwd >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
/Users/[Utilisateur]

Puisque vous êtes dans le répertoire utilisateur, je vais vous indiquer le chemin absolu du script.

(venv) $ crontab -e
* * * * * python /Users/[Utilisateur]/[endroit]/dt2jsonl.py >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
Traceback (most recent call last):
  File "/Users/[Utilisateur]/[endroit]/dt2jsonl.py", line 2, in <module>
    import jsonlines
ImportError: No module named jsonlines

Cette fois, je suis arrivé au script python, mais sans jsonlines. Puisqu'il ne fonctionne pas dans l'environnement venv, vérifiez quel python est utilisé par cron.

(venv) $ crontab -e
* * * * * which python >> /tmp/cron.log 2>&1; python -V >> /tmp/cron.log 2>&1
(venv) $ tail -f /tmp/cron.log
/usr/bin/python
Python 2.7.10

J'utilise le système python2.7, donc je devrais faire quelque chose. Vérifiez quel python utiliser.

(venv) $ which python
/Users/[Utilisateur]/[endroit]/venv/bin/python

Réécrire en python sous venv.

(venv) $ crontab -e
* * * * * /Users/[Utilisateur]/[endroit]/venv/bin/python /Users/[Utilisateur]/[endroit]/dt2jsonl.py >> /tmp/cron.log 2>&1

Après une courte attente, j'ai obtenu le résultat d'impression dans / tmp / cron.log.

(venv) $ tail -f /tmp/cron.log
updated: 2020-01-26 17:48:00.924120
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}

Je pensais qu'il était également écrit en tant que jsonline dans out.jsonl, mais il avait été exécuté manuellement au début, pas le résultat de son exécution avec cron. Il se trouvait dans le répertoire utilisateur car il était exécuté dans le répertoire utilisateur.

(venv) $ cat ~/out.jsonl
{"date": "2020-01-26", "time": "17:48:00.924120"}
{"date": "2020-01-26", "time": "17:49:01.102146"}
{"date": "2020-01-26", "time": "17:50:00.278025"}

L'emplacement de la sortie est différent, mais cron l'a géré dans l'environnement venv. Il est bon de spécifier la sortie du script python avec un chemin absolu, Cette fois, changez le répertoire d'exécution de cron.

(venv) $ crontab -e
* * * * * cd /Users/[Utilisateur]/[endroit]; venv/bin/python dt2jsonl.py >> /tmp/cron.log 2>&1

C'est ce à quoi je m'attendais.

(venv) $ tail -f /tmp/cron.log
updated: 2020-01-26 17:55:00.837256
(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
{"date": "2020-01-26", "time": "17:55:00.837256"}

Attends une minute

(venv) $ cat out.jsonl
{"date": "2020-01-26", "time": "17:39:23.435616"}
{"date": "2020-01-26", "time": "17:55:00.837256"}
{"date": "2020-01-26", "time": "17:56:00.986909"}
{"date": "2020-01-26", "time": "17:57:01.167183"}
{"date": "2020-01-26", "time": "17:58:00.273073"}

Recommended Posts

Exécuter périodiquement un script python avec cron dans un environnement venv
Exécuter le script Python avec TS-220 cron
Utilisation de venv dans un environnement Windows + Docker [Python]
Introduction de sip-4.14 dans l'environnement python3.2.2 avec MacOS 10.7.4
Créer un environnement virtuel avec conda avec Python
Exécuter périodiquement un script Python sur AWS Data Pipeline
Travaillez dans un environnement virtuel avec Python virtualenv.
Utiliser jupyter-lab installé dans l'environnement virtuel python (venv)
Utiliser Python dans un environnement Anaconda avec VS Code
environnement virtuel en Python
environnement python avec docker-compose
Environnement de développement en Python
Environnement virtuel avec Python 3.6
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
Gérez les tâches cron avec python
Grattage au sélénium en Python
Exploitez LibreOffice avec Python
Installer l'environnement Python avec Anaconda
Grattage avec chromedriver en python
POST json avec le script Python 3
Gérez l'environnement python avec virtualenv
Débogage avec pdb en Python
Environnement Venv avec Windows PowerShell
Exécuter des commandes externes avec python
Gérer les variables d'environnement en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Créer un environnement python3 avec ubuntu 16.04
Préparer l'environnement python3 avec Docker
Grattage avec Tor en Python
Construire un environnement python avec direnv
Tweet avec image en Python
Exécuter périodiquement des commandes avec crontab
Combiné avec ordinal en Python
venv: gestion de l'environnement virtuel Python
python avec pyenv et venv
environnement virtuel standard python venv
notebook jupyter dans l'environnement venv python3.8
Créons un script qui s'enregistre avec Ideone.com en Python.
La vidéo ne peut pas être chargée avec Spyder dans l'environnement de développement Python
Installez CaboCha dans l'environnement Ubuntu et appelez-le avec Python.
Reconnaissance des nombres dans les images avec Python
Exécuter le script Python à partir du fichier de commandes
Commencez avec Python! ~ ① Construction de l'environnement ~
Tester avec des nombres aléatoires en Python
GOTO en Python avec Sublime Text 3
Travailler avec LibreOffice en Python: import
Configurer un environnement Python moderne avec Homebrew
Scraping avec Selenium en Python (Basic)
Analyse CSS avec cssutils en Python
Installer Scrapy dans l'environnement Python Anaconda
Construire un environnement Mysql + Python avec docker
Numer0n avec des objets fabriqués avec Python
Créez un environnement virtuel avec Python!
Ouvrez UTF-8 avec BOM en Python
Obtenez le chemin du script en Python
Créer un environnement virtuel avec Python 3