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 :

Communication avec un QProcess


Sujet :

PyQt Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut Communication avec un QProcess
    Bonjour,

    j'utilise un qPlainTextEdit pour m'afficher le retour d'un QProcess, ça fonctionne très bien jusqu'à ce qu'on me demande un mot de passe.

    Je voudrais donc pouvoir envoyer celui-ci via un qLineEdit ou même simplement via une variable pré remplie.

    J'ai vu pas mal de chose sur la création complète d'un terminal (python ou bash) mais c'est bien lourd et compliqué pour juste un mot de passe...

    J'ai essayé differents trucs pour communiquer avec mais rien ne m'a semblé fonctionner... (write, passer par un fichier d'entré...)

    Il n'est évidement pas possible de rentrer ce mot de passe dans le code initial (bien dommage...).

    Est-il possible de faire un truc relativement simple ou faut-il installer un terminal complet pour ça ?


    Petite question annexe, la demande de mot de passe n’apparaît qu'en console et non sur mon qPlainTextEdit alors que j'utilise l'option : setProcessChannelMode(1), peut on forcer son apparition sur le widget ?


    Merci à vous et bonne journée.

    EDIT : je teste avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    self.process.start('bash -i')
    self.process.write("debuild --no-tgz-check --no-lintian -us -uc -S\n")
    mais toujours pareil, il ne me demande pas le mot de passe dans le widget et impossible du coup d'envoyer le mot de passe non plus...

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut hizoka,

    GPg agent peut t'ouvrir une fenêtre pour le mot de passe, il faut le lancer.

    En vérifiant d'abord s'il n'est pas déjà actif.

    Je te montre le code tel quel:
    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
     
        def generate(self):
            """Create the package.
     
            """
            self._print("Generate the deb ...")
            # FIXME for the GPG agent, we assume we are in '/home'
            user = pwd.getpwuid(os.getuid())[5]
            cmd = ["debuild", "-i"]
            if self.key:
                sub = subprocess.Popen(["gpg-agent"], universal_newlines=True, 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.PIPE).communicate()
     
                if not "gpg-agent running and available" in sub[1]: 
                    #print "Not running"       
                    cm = "eval '$(gpg-agent --daemon --write-env-file '{0}/.gpg-agent-info')'".format(user)
                    os.system(cm)
                cmd = ["debuild", "-S", "-sa", "-k" + self.key]
                self._print(" ".join(cmd))
     
            else:
                cmd = ["debuild", "-i", "-us", "-uc"]
                self._print(" ".join(cmd))
     
            old_rep = os.getcwd()
            os.chdir(self.main.app_fld) 
            sub = subprocess.Popen(cmd, universal_newlines=True, 
                                    stdout=subprocess.PIPE)
     
            while 1:
                text = sub.stdout.readline()[:-1]
                if type(text) != str or text == '' and sub.poll() != None:
                    break
                elif type(text) == str and len(text) > 4:
                    self._print(text)
     
            os.chdir(old_rep)
    Le source est ici: http://bazaar.launchpad.net/~vincent.../debianizer.py

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    salut,

    merci pour la reponse, mais là ce n'était qu'un exemple, car dans le cas d'une commande avec sudo, on va me demander mon mot de passe et ça fait exactement pareil.

    EDIT :
    bon on peut toujours utiliser kdesudo par ex...

    apres la chose m'interresse quand meme car ca permettrait d'autres applications simples...

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Bonjour,

    je fais un petit up pour savoir s'il y a moyen ou non de communiquer relativement simplement avec un qprocess comme expliqué dans le 1er message et savoir aussi pourquoi les demandes de mot de passes ne s'affichent pas dans le qPlainTextEdit.

    Merci

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je n'ai pas essayé, mais tu devrais peut-être utiliser la méthode décrite ici: il s'agit de donner à QProcess les méthodes pour afficher dans le QPlainTextEdit.

  6. #6
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    il faudra que je teste ça meme si ca complique un peu histoire de

    merci !

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Je viens de tester mais je ne pige pas pourquoi j'ai un probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            b = B()
            b.qprocess.readyReadStandardOutput.connect(self.readStdOut)
            b.qprocess.readyReadStandardError.connect(self.readStdErr)
            b.doWork("sudo su")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class B(QObject):
        def __init__(self):
            self.qprocess = QProcess(self)
     
        def WorkNow(cmd):
            self.qprocess.start(cmd)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "lpsm.py", line 1486, in SourceUpload
        b = B()
      File "lpsm.py", line 1948, in __init__
        self.qprocess = QProcess(self)
    RuntimeError: super-class __init__() of type B was never called
    Une idée ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    salut,

    Hé, object != QObject

    Il faut l'instancier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class B(QObject):
        def __init__(self):
            super(B, self).__init__()
            self.qprocess = QProcess(self)

  9. #9
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Bon bah apres quelques tests, ça ne change rien...

    il n'affiche pas les demandes de mot de passe...

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,

    Citation Envoyé par hizoka Voir le message
    Bon bah apres quelques tests, ça ne change rien...

    il n'affiche pas les demandes de mot de passe...
    Les demandes de mots de passe vont directement sur le "controlling terminal" i.e. le stdout de l'application.
    Comme çà ne passe pas les "pipes" du QProcess, çà ne remonte pas dans le textEdit.

    On peut écrire du code pour attraper çà, mais automatiser ce genre de chose n'est pas recommandable.

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

  11. #11
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    merci pour ta réponse, je voulais tester car cela ouvrait de grandes possibilités sans trop coder...

    Tant pis, il va falloir continuer à trouver des moyens d'afficher des boites d'entrée de clé graphique

    Merci à vous.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par hizoka Voir le message
    merci pour ta réponse, je voulais tester car cela ouvrait de grandes possibilités sans trop coder...

    Tant pis, il va falloir continuer à trouver des moyens d'afficher des boites d'entrée de clé graphique
    Mettre des mots de passe en clair dans du code ouvre effectivement de grandes possibilités.
    On appelle çà "trou de sécurité".

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

  13. #13
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    c'est vrai...

  14. #14
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Et pourquoi ça ne convenait pas avec GPG Agent ? portabilité ?

    C'est ce qu'utilisent d'autres applis graphiques comme Synaptic par exemple.

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Si si ca marche tres bien

    Le mieux serait que pinentry-wallet soit debugué mais c'est un autre problème.

    Mais je voyais un peu plus loin, pour d'autres applications. Mais après en effet, il y a des problèmes de sécurité.

    Pour le moment ça me suffit entre kdesudo et pinentry-qt4 il me demande d'entrer mes mots de passes dans ces box graphiques.

Discussions similaires

  1. Interface de communication avec un téléphone fixe.
    Par guslinux dans le forum Périphériques
    Réponses: 2
    Dernier message: 19/10/2005, 19h55
  2. Perdu avec la communication avec le port serie
    Par gilles641 dans le forum Langage
    Réponses: 8
    Dernier message: 23/08/2005, 20h11
  3. [C#] Communication avec les ports parallèle et RS232
    Par jejerome dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2004, 22h57
  4. [Débutant][Applet] Communication avec Servlet - IO Exception
    Par gandalf_le_blanc dans le forum Applets
    Réponses: 35
    Dernier message: 16/04/2004, 13h29
  5. [SSL]Communication avec un serveur en https
    Par menon dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 04/09/2003, 16h38

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