Monitorer un répertoire en python

Ok la question à sa place sur un autre forum mais elle a aussi sa place ici:

Dans un script python, j’aurais besoin de déclancher une action (appeler une fonction…) quand un nouveau fichier arrive sur dans un répertoire donné.
Il faut que ca marche sous tous les linux (on peut supposer qu’on a un 2.6 et pas un 2.4 :)) et sous macOSX. Sous windows si possible mais ce n’est pas vraiment obligé.
Soit j’ai sauté une page dans la doc (c’est bien possible) soit python ne propose pas ca par défaut (on suppose un python au moins 2.5 voire 2.6 si ca aide).
J’ai trouvé des modules basés sur inotify mais je peux me brosser pour que sa marche sur des redhat anquites sous linux 2.6.9 :frowning: (il faut >=2.6.13 je crois) et sous mac…
Je peux aussi le faire de facon moche à la main mais bof bof.

Le monitoring n’a pas à réagir dans le miliseconde quand un nouveau fichier arrive. Un truc qui me donnerait la liste des nouveaux fichiers toutes les minutes suffit.
Ca m’étonne un peut que python ne propose pas ca…j’ai dû raté qqch…

Ben si t’a pas besoin d’une réactivité à l’arrivée du fichier, tu peux te contenter de passer par un scheduler. C’est l’approche qu’ont tous les EAI. Sans prise de tête, tu en a un sur toute distribution Linux : Cron. Ok là je dois rien t’enseigner :wink: . Sinon, il me semble que Python embarque un scheduler dans ses fonctions : sched. Il te fera peut être l’affaire.
Edité le 10/06/2009 à 15:07

Cron peut être une solution mais ce n’est pas assez souple pour ce que je veux en faire.
Le monitoring n’est qu’une petite partie d’un script avec un GUI et tout le tintouin.
Cron pourrait lancer un autre script qui écrirait la liste des nouveaux fichiers…qui serait relue…bof bof.
Rien que le fait de devoir écrire à la main le code pour lister les nouveaux fichiers…bof…python devrait proposer ca :frowning:

import sched ? voyons ca :wink: … c’est pas mal! :slight_smile:

Arf, au final, je vais donc bricoler un truc à coup de sched ou de timer/sleep…j’ai assez d’heures de train ce week end…
Si qlqn a une autre bonne idée…

C’est indiscret si je te demande ce que tu veux faire ?

Traitrer des images au fur et à mesure qu’elles arrivent dans un répertoire donné (qui est un répertoire distant monté en nfs).
La manip prend des images à un rythme non régulier et, à chaque fois qu’une image arrive dans le répertoire en question, je veux l’ouvrir et la traiter…si ce n’est pas déjà fait.

Ok, donc tu a un job qui consiste à traiter une image, job déclenché par un scheduler (en fait je ne sais pas comment faire autrement sinon que le le logiciel qui a copié le fichier déclenche le workflow).

Pour moi tu a d’un coté le job qui est en deux parties : sélectionner les fichiers à traiter d’un coté, traiter de l’autre.
D’un autre coté, le déclencheur est donc un scheduler indépendant des outils de workflow de traitement. Cron peut faire l’affaire. Tu peux coder un outil de ce type ou utiliser une solution EAI/ESB existante.

Si ton besoin est perso et limité à ça, franchement… cronise. Si il est plus complexe, développe ton petit script qui lui schedulera les actions (peut être un comportement en fonction d’évènements extérieurs). Si c’est dans un cadre d’entreprise avec des besoins plus complexes, il faudrait regarder ce qui se fait déjà (là j’ai pas de solutions en Python).

“en fait je ne sais pas comment faire autrement sinon que le le logiciel qui a copié le fichier déclenche le workflow”
Impossible. J’ai juste accès à un rep monté en nfs dans lequel les images arrivent. Aucune autre com possible entre les deux machines (je ne suis pas maitre du réseau…sinon je n’aurais jamais fait ça comme ça…mais bon…c’est pas mon boulot…)

cron règle en effet une bonne partie du pb. De que je trouve dommage, c’est d’avoir à demander à python de me pondre la liste des fichiers puis d’avoir à la comparer avec la listes d’avant (merci les set…).
Je ne comprends pas trop pourquoi python ne propose pas une solution unifiée pour touut ça.

Bref, je code un truc à base de cron d’un coté et de
while(1):
sleep(10)
blablalba.

Le while(1) me semble horrible…affreux…mais avec le long sleep, ce n’est pas SI ridicule au final.

Je vais quand même voir s’il n’y a pas une PEP qui traine à ce sujet :wink:

ps : pas encore de ‘résolu’ car on ne sait jamais…mais j’ai peu d’espoir (et pas bcp de temps)

Ben oui mais comment veut tu faire autrement, surtout si le répertoire contenant les fichiers à traiter est le répertoire des fichiers traités… Que ce soit en Python ou autre, soit tu déplace les fichiers traités, soit tu maintient une liste des fichiers traités, toute autre approche est trop risquée.

“soit tu maintient une liste des fichiers traité” J’aurais espéré que la lib standard de python me le fasse :wink:
fakbill, gros glandeur quand il code en python :slight_smile: