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

PyQt Python Discussion :

rediriger les messages d'un navigateur basique vers une fichier journal


Sujet :

PyQt Python

  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut rediriger les messages d'un navigateur basique vers une fichier journal
    Bonjour,

    j'ai récupérér et bricoler le code d'un navigateur basique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/python
     
    Name = "Dinghy"
    Version = "0.1-n+1"
     
    import logging
    logging.basicConfig(filename='/tmp/'+Name+'.log', level=logging.DEBUG)
    import re
    import sys
    import signal
    #pour interrompre le programme depuis la ligne de commande avec Ctrl-C
    signal.signal(signal.SIGINT, signal.SIG_DFL)
     
    from PyQt5.QtCore import *
    from PyQt5.QtWebEngineWidgets import *
    from PyQt5.QtWidgets import QApplication, QToolBar
     
    #traitement des arguments (incomplets), s'il y en a, ou pas ;)
    protocole = "http://"
    if len(sys.argv) > 1 :
        url = sys.argv[1] if re.match( '^https*://', sys.argv[1] ) else protocole + sys.argv[1]
    else:
        url = 'http://google.com'
    logging.debug("site: "+ url)
     
    app = QApplication(sys.argv)
     
    browser = QWebEngineView()
    browser.load(QUrl(url))
    browser.setWindowTitle(Name + "_" + Version)
    browser.showFullScreen()
     
    sys.exit(app.exec_())
    par exemple, pour developpez.com, ce genre de messages s'affichent dans le terrminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    libpng warning: iCCP: known incorrect sRGB profile
    libpng warning: iCCP: cHRM chunk does not match sRGB
    js: The deviceorientation events are blocked by feature policy. See <a href="https://github.com/WICG/feature-policy/blob/master/features.md#sensor-features" target="_blank">https://github.com/WICG/feature-poli...ensor-features</a>
    [550780:550925:0921/004104.786627:ERROR:object_proxy.cc(621)] Failed to call method: org.freedesktop.DBus.Properties.Get: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service files
    [550780:550925:0921/004104.786976:ERROR:object_proxy.cc(621)] Failed to call method: org.freedesktop.UPower.GetDisplayDevice: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service f
    iles
    [550780:550925:0921/004104.787261:ERROR:object_proxy.cc(621)] Failed to call method: org.freedesktop.UPower.EnumerateDevices: object_path= /org/freedesktop/UPower: org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.UPower was not provided by any .service f
    iles
    je voudrais qu'ils soient redirigés vers un fichier journal.

    j'ai fait quelques essais avec logging, sans obtenir le résultat attendu : les messages continuent de s'afficher dans le terminal.
    je pourrais faire un wrapper en shell, mais je trouve plus propre que ce soit python qui s'en charge.

    comment faire ça aussi simplement que possible ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    j'ai continué de chercher, et j'ai trouvé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    logFile = "/tmp/" + Name                                                                                                                                                                                                                                                         
    # open our log file                                                                                                                                                                                                                                                              
    se = open("%s.log" % logFile, 'a')                                                                                                                                                                                                                                               
    # re-open stdout
    sys.stderr = os.fdopen(sys.stderr.fileno(), 'w')
    # redirect stderr to the log file opened above
    os.dup2(se.fileno(), sys.stderr.fileno())                                                                 
    sys.stderr.write("=========================================================================\n")
    ça fait ce que je veux, mais je ne vous dirai pas que je comprends tout, ni si c'est correct, et optimal.

    qu'en pensez-vous ?

    j'ai essayé de mettre le sys-stderr.write() à différents niveaux de l'exécution du script sans parvenir à le mettre à la fin des messages d'erreurs.
    vous avez une idée ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Salut,

    Citation Envoyé par N_BaH Voir le message
    qu'en pensez-vous ?
    Cet article explique bien ce qu'il se passe et que faire pour traiter les différents cas.

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

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Tant qu'à disposer d'un navigateur minimum en PyQt5, je te propose le mien:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    import os
    from PyQt5 import QtWidgets, QtCore, QtWebEngineWidgets
     
    #############################################################################
    class Navigweb(QtWidgets.QMainWindow):
     
        #========================================================================
        def __init__(self, parent=None):
            super().__init__(parent)
     
            self.setWindowTitle("Navigateur web")
            self.resize(800, 600)
     
            self.view = QtWebEngineWidgets.QWebEngineView()
     
            self.setCentralWidget(QtWidgets.QFrame())
            layout = QtWidgets.QGridLayout()
            layout.addWidget(self.view, 0, 0)
            layout.setContentsMargins(0, 0, 0, 0)
            self.centralWidget().setLayout(layout)
     
            self.page = QtWebEngineWidgets.QWebEnginePage()
     
        #========================================================================
        def affiche(self, fichierweb):
            """affiche le fichier web donné
            """
            self.page.setUrl(QtCore.QUrl(fichierweb))
            self.view.setPage(self.page)
            self.view.show()
     
    #############################################################################
    if __name__ == '__main__':
     
        app = QtWidgets.QApplication(sys.argv)
     
        fenetre = Navigweb()
        fenetre.show()
     
        #========================================================================
        # exemple d'affichage d'un fichier html "aide.html"
        #pageweb = "file:///" + os.path.abspath("aide.html").replace("\\", "/")# + "#partiecommune"
     
        # exemple d'affichage d'une video youtube
        #pageweb = "https://www.youtube.com/tv#/watch?v=bLhi6lppatw"
     
        # exemple d'affichage de pages web
        #pageweb = "https://www.google.fr"
        pageweb = "https://www.developpez.net/forums/f96/autres-langages/python/"
     
        #========================================================================
        # affiche la page demandée
        fenetre.affiche(pageweb)
     
        sys.exit(app.exec_())
    A noter qu'on peut aussi afficher des fichiers pdf en utilisant pdf.js de Mozilla.


    Quant à récupérer les messages d'erreur, il y a une solution facile: utiliser QtCore.qInstallMessageHandler.

    Voilà comment je l'utilise:

    J'ai un fichier python que j'appelle "msgerreur.py", qui contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    from PyQt5.QtCore import (QtDebugMsg, QtInfoMsg, QtWarningMsg, QtCriticalMsg, 
                        QtFatalMsg, QtSystemMsg)
    from PyQt5.QtWidgets import QMessageBox
     
    #############################################################################
    def messagederreur(typerr, contexte, msgerr):
        """Permet d'afficher et/ou de neutraliser les messages d'erreur.
           Pour les messages critiques: affiche dans une fenêtre graphique.
           Mise en place par: QtCore.qInstallMessageHandler(messagederreur)
        """
        if typerr==QtDebugMsg:
            # exemple de désactivation d'un message
            #if "QWindowsFileSystemWatcherEngine: unknown message" in msgerr:
            #    return 
            print("DEBUG:\n{}\n".format(msgerr))
     
        elif typerr==QtWarningMsg:
            # exemple de désactivation d'un message
            #if "QFont::setPixelSize: Pixel size <= 0 (0)" in msgerr:
            #    return
            print("WARNING:\n{}\n".format(msgerr))
     
        elif typerr in [QtCriticalMsg, QtFatalMsg, QtSystemMsg]:    
            print("ERREUR CRITIQUE:\n{}\n".format(msgerr))
            QMessageBox.critical(None, 
                "ERREUR CRITIQUE:",
                "{}\n".format(msgerr))
        else:
            # message retourné par QtCore.QtInfoMsg créé à partir de Qt 5.5
            print("INFO:\n{}\n".format(msgerr))
    Dans le code qui l'utilise, il suffit d'ajouter juste après le "QtWidgets.QApplication":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        from msgerreur import messagederreur  
        QtCore.qInstallMessageHandler(messagederreur)
    La fonction "messagederreur(typerr, contexte, msgerr)" peut bien sûr être modifiée comme on le veut: affichage dans la console, ou dans une fenêtre graphique, ou dans un fichier .log.
    On peut même neutraliser certains warning inintéressant!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    merci.

    je digère ça, et je reviens vous en parler.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 551
    Points : 19 385
    Points
    19 385
    Par défaut
    pour moi, c'est bon.

    j'ai simplifié très légèrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Name = "nomQuelconque"
    logFile = 
    # open our log file
    se = open("%s.log" % Name, 'a')
    # redirect stderr to the log file opened above
    os.dup2(se.fileno(), sys.stderr.fileno())
    print("="*16",file=sys.stderr)
    j'ai supprimé la ligne sys.stderr = os.fdopen(sys.stderr.fileno(), 'w').
    je ne comprends pas pourquoi elle serait nécessaire, donc je l'ai supprimée sans que cela cesse d'envoyer les messages vers le fichier journal.

    sur le sujet, pus près de nous : https://python.developpez.com/cours/...out_stderr.php
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/12/2011, 21h26
  2. Réponses: 2
    Dernier message: 22/04/2011, 15h26
  3. Rediriger les messages d'erreur Delphi
    Par petitcoucou31 dans le forum Langage
    Réponses: 17
    Dernier message: 20/03/2008, 00h10
  4. rediriger les Messages d'erreurs d'Ado
    Par helmis dans le forum Bases de données
    Réponses: 4
    Dernier message: 22/02/2006, 00h35
  5. Rediriger les messages d'erreur
    Par goblin dans le forum Langage
    Réponses: 3
    Dernier message: 25/12/2005, 20h04

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