Bonjour,
Désolé pour le titre mais j'ai du mal à exprimer de façon concise le problème auquel je fais face.
Pour la petite histoire, je suis entrain de développer un programme en python (3.6 au moment où j'écris ces lignes) afin d'automatiser les synchronisations de mon package manager portage (je suis sous GNU/Linux Gentoo: `emerge --sync`) et qu'il me donne de façon automatique le nombre de logiciel à mettre à jour (avec opts --pretend).
Je développe de la même manière une mise à jour auto du kernel (j'utilise un kernel 'custom' dont les sources se mettent à jour grâce à `git`).
Bref, je suis sur la fin de l'écriture des modules (j'ai tout séparé en module).
Je rencontre un dernier souci (lol dernier ce serait super) :
Dans mon module qui gère tout le côté 'portage' (le package manager de gentoo, écrit en python) nommé 'portagemanager.py' j'ai deux classes: 'PortageHandler' qui récupère les infos grâce aux modules de portage/emerge et 'EmergeLogParser' qui est responsable de récupérer les infos grâce au fichier de log : '/var/log/emerge.log.'
Dans ma classe 'PortageHandler' j'ai une méthode 'dosync()' qui est responsable de la synchronisations de 'portage'. Dans ma classe 'EmergeLogParser', j'ai une méthode 'last_sync()' qui récupère le dernier timestamp de la synchronisation de 'portage' grâce à une méthode 'getlog()' qui récupère juste les dernières n lignes du fichier de log ('/var/log/emerge.log'): ça évite de rechercher dans tout le fichier qui est/peu devenir gros (je viens de réinstaller mon système suite à un nouveau pc, mais mon avant dernier emerge.log pesait 24Mo avec 267 605 lignes).
A la fin de la synchronisation et si celle-ci s'est bien passée, j'appelle ma classe 'EmergeLogParser' et la méthode 'last_sync()' afin de récupérer dans le fichier de log le dernier timestamp de la synchronisation de portage (ce qui est loin d'être parfait et que je vais modifié je pense).
Voilà j'arrive à mon problème: le timestamp que je récupère n'est pas le dernier mais l'avant dernier. On dirait, que python ne voit pas la mise à jour du fichier log: lorsque j'appelle 'dosync()', le module 'emerge' responsable de la synchronisation de 'portage' écrit dans /var/log/emerge.log.
J'ai le même timestamp (c'est à dire l'avant dernier) si j'appelle par la suite ma classe 'EmergeLogParser' et ma méthode 'last_sync()' depuis mon 'main()'.
Par contre, si le programme sort et je le relance en appelant directement ma classe 'EmergeLogParser' et ma méthode 'last_sync()' depuis 'main()': bingo j'ai le dernier timestamp ....
J'ai testé un time.sleep(jusqu'à 30) avant de récupérer le dernier timestamp: c'est pareil j'ai toujours l'avant dernier...
Franchement je comprend pas, un regard extérieur pourrait m'aider.
Je vous met en pièces jointe le module 'portagemanager.py' si vous avez besoin de tout le reste, y a pas de soucis
A noter: je viens de me mettre à python et c'est mon premier programme. Je suis un amateur et je fais ça sur mon temps libre
Merci,
Jjeje007
Partager