IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

On dirait que python ne 'voit' pas que mon fichier log à été mise à jour [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut On dirait que python ne 'voit' pas que mon fichier log à été mise à jour
    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
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Salut,

    C'est comme si les dernières informations n'avaient pas été "flushé" sur disque.
    Est-ce que c'est le process qui écrit le log qui va le lire?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Non non le process qui écrit sur le disque c'est l'un (des très nombreux) module du package manager 'portage' (arborescence). Mon programme capture le stdout et stderr et fais un log séparé de ce que le process devrait écrire dans le terminal. (classe: 'CapturedFd', module: utils).

    C'est vraiment bizarre. Mais les informations sont bien flushés sur le disque parce qu'un `grep 'emerge.*--sync' /var/log/emerge.log` me donne bien le dernier timestamp... (pendant que mon programme est en cours ... j'ai plusieurs 'repository' à mettre à jour).

    Jjeje007

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 753
    Par défaut
    Citation Envoyé par Jjeje007 Voir le message
    C'est vraiment bizarre. Mais les informations sont bien flushés sur le disque parce qu'un `grep 'emerge.*--sync' /var/log/emerge.log` me donne bien le dernier timestamp...
    Ce qu'il semble raisonnable de suspecter ici est que le fichier ouvert en lecture récupère une information sur le "end of file" qui n'a pas été mise à jour entre 2 itérations.
    Je ne vois pas comment Python serait responsable de çà: il ne fait qu'utiliser les services du file system. S'il est un particulier, c'est peut être une piste. La version de l'OS en est peut être une autre.

    De toutes façons, vous avez le choix entre:
    • fabriquer un reproducteur permettant de reproduire le problème sans le reste de l'application et de permettre à d'autre d'y jeter un œil.
    • contourner le problème en récupérant la fin du fichier avec une commande "tail" lancée via subprocess.


    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Oui c'est ce que j'ai pensé aussi. Je pense que je vais réécrire mon parser de log et voir si c'est pas de ce côté là qu'il y a un souci.
    En ce qui concerne le système de fichier c'est de l'ext4 classique et l'os c'est gnu/linux gentoo en 64bits tout à jour.

    En ce qui concerne l'écriture d'un reproducteur, je verrais par la suite si j'arrive déjà à fixer mon parser. Je sais pas si j'ai les compétences pour le faire, j'apprends python sur le tas et au fur à mesure.

    Je vous tiendrais au courant des mes avancées.

    Merci pour l'aide et bonne journée.

    Jjeje007

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Bon,
    après avoir passé quasiment la journée là-dessus, j'ai trouvé où ça bugguait. C'est en appellant la synchronisation de portage en passant par le module adéquat qui fait bugguer mon parser. Je viens d'essayer de la lancer en utilisant subprocess et là je récupère bien le dernier timestamp.

    Donc je sais où ça buggue mais alors pourquoi ça reste un grand mystère ...

    Je vais pas trop me prendre la tête pour l'instant et je vais garder mon subprocess.

    Jjeje007

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 29/11/2017, 10h52
  2. Python ne voit pas le format Windows
    Par hdgetnet dans le forum Général Python
    Réponses: 10
    Dernier message: 18/03/2010, 21h33
  3. Réponses: 1
    Dernier message: 23/12/2007, 20h08
  4. Comment m'assurer que mon fichier est bien un exec unix
    Par Khaled.Noordin dans le forum Apple
    Réponses: 5
    Dernier message: 05/07/2007, 18h37
  5. [XML]Comment tester que mon fichier XML est comme ceci?
    Par Devil666 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2005, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo