Utilisation de crontab pour un script PYTHON

Résolu/Fermé
cvan85 Messages postés 56 Date d'inscription mardi 1 novembre 2011 Statut Membre Dernière intervention 27 août 2024 - Modifié le 6 juil. 2022 à 15:29
cvan85 Messages postés 56 Date d'inscription mardi 1 novembre 2011 Statut Membre Dernière intervention 27 août 2024 - 7 juil. 2022 à 19:06
Bonjour,

Je rencontre un problème avec l'utilisation de crontab pour lancer un script Python. À partir du terminal ce script tourne sans problème. Souhaitant le lancer tous les jours à 19h00, je l'ai inclus dans un fichier crontab.

Mon script shell de lancement (
LANC_BAG
)
:

clear
LOC_FICH=/users/xxxxxxxx/PYTHON/Prog/gestion_crypto/
export LOC_FICH 
DDJ=`date +%d-%m-%Y`
NFIC=/users/xxxxxxxxr/bag_report
EXT=".txt"

$HOME/PYTHON/Prog/bag.py >$NFIC$DDJ$EXT 2>&1


Fichier crontab :

00 19 * * * /users/xxxxxxxxxx/PYTHON/prog/LANC_BAG

Script python (partiel)

#!/usr/bin/env python3.9
# -*- coding:Utf-8 -*-
import os
import datetime
# Importation des modules de librairies (Request, Session ...)
from requests import Request, Session
from requests.exceptions import ConnectionError, Timeout, TooManyRedirects
import json
#...


Au lancement à 19h00, j'ai le message suivant dans
stderr
:

env: python3.9: No such file or directory 


J'ajoute que si je remplace la ligne
$HOME/PYTHON/Prog/bag.py >$NFIC$DDJ$EXT 2>&1
par un simple
echo
, je n'ai pas en erreur.

Y a t-il une incompatibilité à l'utilisation d'un script Python avec crontab (sous MacOS)

Merci
Claude

Configuration: Configuration: Configuration: Macintosh / Safari 15.0
A voir également:

5 réponses

mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
Modifié le 6 juil. 2022 à 15:33
Bonjour,

Quelle version de python est installée sur ton système ? Car la deuxième ligne de ton script stipule qu'il faut utiliser
python3.9
, or celui-ci ne semble manifestement pas installé.

D'ailleurs, pourquoi forcer la version de python ?

Personnellement, j'écrirais simplement au début du fichier python :

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


Cela lancera ton script avec le dernier interpréteur
python3
disponible, comme le montre la commande :
ls -l $(which python3)


Exemple :

(mando@silk) (~) $ ls -l $(which python3)
lrwxrwxrwx 1 root root 10 2 mai 00:33 /usr/bin/python3 -> python3.10


Bonne chance
0
cvan85 Messages postés 56 Date d'inscription mardi 1 novembre 2011 Statut Membre Dernière intervention 27 août 2024 1
Modifié le 6 juil. 2022 à 17:28
Bonjour et merci pour ces premiers éléments de réponse.

J'utilise bien la version 3.9 comme retourné par ta commande :

ls  -l $(which python3)
lrwxr-xr-x 1 root admin 9 10 déc 2020 /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 -> python3.9


D'ailleurs hors utilisation du
crontab
, ce script fonctionne.
Comme si le fait d'être lancé via le cron modifiait mon environnement.
0
cvan85 Messages postés 56 Date d'inscription mardi 1 novembre 2011 Statut Membre Dernière intervention 27 août 2024 1
6 juil. 2022 à 18:04
Un grand merci, cela faisait un moment que je tournai en rond.


S'agissant du PATH, il contient bien le bon chemin :
/usr/bin/env | grep "^PATH="
PATH=/Library/Frameworks/Python.framework/Versions/3.9/bin:./PYTHON/prog:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

J'ai utilisé le lancement via un script shell et spécifié le chemin de l'interpréteur python comme tu le préconises.
J'ai également dans mon script python indiqué python3 afin d'utiliser le lien vers python 3.x

Mon traitement s'effectue donc parfaitement via le crontab.

Encore merci.
Claude
0
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
7 juil. 2022 à 11:35

Merci pour ton retour et bonne continuation ! 

Juste une précision, d'après cette discussion, cron écrase effectivement la variable d'environnement. Apparemment, tu peux définir cette variable PATH

  • soit en début de fichier :
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  • soit avec une ligne du genre :
* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing

Dans ton cas, j'essaierais donc simplement de mettre en début de fichier cron :

PATH=$PATH

Bonne chance

0
cvan85 Messages postés 56 Date d'inscription mardi 1 novembre 2011 Statut Membre Dernière intervention 27 août 2024 1
7 juil. 2022 à 19:06

Merci pour ce complément.

Claude

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33363 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 novembre 2024 7 801
6 juil. 2022 à 17:27
Bonjour Claude,

Qui lance cron ? Le même utilisateur ? Si tu lances
/usr/bin/env
avec cet utilisateur, est-ce que
/Library/Frameworks/Python.framework/Versions/3.9/bin/
figure dans ton
PATH
?

/usr/bin/env | grep "^PATH="


À mon avis, non. Le chemin dans lequel est installé Python 3 me paraît aussi assez suspect (il devrait être
/usr/bin
si c'est comme sous Linux)... mais peut-être est-ce normal sous Mac OS ? As tu installé
python3
via ton gestionnaire de paquets (
brew install python3
) ?

Par ailleurs, je maintiens que tu ne devrais pas (à moins d'avoir une très bonne raison) de spécifier que tu veux un interpréteur
python3.9
, mais bien
python3
. Cela permettra que ton script continue à marcher quand tu mettras à jour ton interpréteur Python 3.

Enfin, une autre manière de résoudre le problème est de lancer ton script python via script shell en spécifiant le chemin vers l'interpréteur python que tu souhaites utiliser.

#!/usr/bin/env sh
clear
LOC_FICH=/users/xxxxxxxx/PYTHON/Prog/gestion_crypto/
export LOC_FICH 
DDJ=`date +%d-%m-%Y`
NFIC=/users/xxxxxxxxr/bag_report
EXT=".txt"
PYTHON3=/Library/Frameworks/Python.framework/Versions/3.9/bin/python3
$PYTHON3 $HOME/PYTHON/Prog/bag.py >$NFIC$DDJ$EXT 2>&1


Bonne chance
-1