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 :

pdfgrep avec python


Sujet :

Python

  1. #1
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut pdfgrep avec python
    Bonsoir, j'ai une commande qui fonctionne dans le terminal Ubuntu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pdfgrep circuit -r /media/rep
    Je souhaiterais pouvoir exécuter la commande mais cela ne fonctionne pas. Je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import subprocess
    recherche="circuit"
    repertoire = "/media/rep"
    subprocess.Popen(['/bin/sh', '-c', 'pdfgrep %s -r %s'%(recherche,repertoire)])
    Apparemment, je n'ai pas saisi les subtilités de subprocess.
    Si qqn a une idée...

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par marco056 Voir le message
    Apparemment, je n'ai pas saisi les subtilités de subprocess.
    Si qqn a une idée...
    subprocess.Popen(("pdfgrep", "circuit", "-r", "/media/rep"))...

    Citation Envoyé par marco056 Voir le message
    mais cela ne fonctionne pas.
    Pour checker si ça vient de subprocess ou pdfgrep tu peux tenter le basic subprocess.Popen(("ls", "-l")) qui, chez-moi, fonctionne...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    avec grep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import subprocess
    p = subprocess.Popen(("ls", "-l"))
    print(p)
    j'obtiens ceci :
    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
     
    runfile('/media/marco5/Disque-4To/TSI_Phys/grep0.py', wdir='/media/marco5/Disque-4To/TSI_Phys')
    <subprocess.Popen object at 0x7f1292ba9f60>
    total 541
    -rwxrwxrwx 1 root root    228 oct.  24 14:14 aspirateur1008.py
    drwxrwxrwx 1 root root   4096 oct.  17 16:12 colles_18-19
    drwxrwxrwx 1 root root   4096 déc.  14  2018 Colles-autres
    drwxrwxrwx 1 root root  61440 déc.   9 11:00 Divers-LaTeX
    drwxrwxrwx 1 root root  20480 déc.  11 14:27 doc-olivier
    drwxrwxrwx 1 root root   4096 déc.  11 20:12 doc-web
    -rwxrwxrwx 1 root root    170 déc.  14 00:58 grep0.py
    -rwxrwxrwx 1 root root   2072 déc.  14 00:58 pdfgrep0.py
    drwxrwxrwx 1 root root  65536 nov.   1 14:18 TSI_14-15
    drwxrwxrwx 1 root root  40960 nov.   1 14:18 TSI_15-16
    drwxrwxrwx 1 root root  36864 nov.   1 14:18 TSI_16-17
    drwxrwxrwx 1 root root  65536 nov.   1 14:18 TSI_17-18
    drwxrwxrwx 1 root root  98304 nov.   1 14:18 TSI_18-19
    drwxrwxrwx 1 root root 139264 déc.  13 18:39 TSI_19-20
    drwxrwxrwx 1 root root   4096 oct.  30 01:30 TSI_spe_doc
    drwxrwxrwx 1 root root   4096 déc.  11 20:17 TSI_sup_doc
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import subprocess
    recherche="circuit"
    repertoire = "/media/marco5/Disque-4To/TSI_Phys"
    p = subprocess.Popen(['/bin/sh', '-c', 'pdfgrep %s -r %s'%(recherche,repertoire)])
    print(p)
    j'obtiens ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <subprocess.Popen object at 0x7f12900ee780>
    Si je ne mets pas le p = et le print, aucune sortie...

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marco056 Voir le message
    avec grep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import subprocess
    p = subprocess.Popen(("ls", "-l"))
    print(p)
    j'obtiens ceci :
    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
     
    runfile('/media/marco5/Disque-4To/TSI_Phys/grep0.py', wdir='/media/marco5/Disque-4To/TSI_Phys')
    <subprocess.Popen object at 0x7f1292ba9f60>
    total 541
    -rwxrwxrwx 1 root root    228 oct.  24 14:14 aspirateur1008.py
    drwxrwxrwx 1 root root   4096 oct.  17 16:12 colles_18-19
    drwxrwxrwx 1 root root   4096 déc.  14  2018 Colles-autres
    drwxrwxrwx 1 root root  61440 déc.   9 11:00 Divers-LaTeX
    drwxrwxrwx 1 root root  20480 déc.  11 14:27 doc-olivier
    drwxrwxrwx 1 root root   4096 déc.  11 20:12 doc-web
    -rwxrwxrwx 1 root root    170 déc.  14 00:58 grep0.py
    -rwxrwxrwx 1 root root   2072 déc.  14 00:58 pdfgrep0.py
    drwxrwxrwx 1 root root  65536 nov.   1 14:18 TSI_14-15
    drwxrwxrwx 1 root root  40960 nov.   1 14:18 TSI_15-16
    drwxrwxrwx 1 root root  36864 nov.   1 14:18 TSI_16-17
    drwxrwxrwx 1 root root  65536 nov.   1 14:18 TSI_17-18
    drwxrwxrwx 1 root root  98304 nov.   1 14:18 TSI_18-19
    drwxrwxrwx 1 root root 139264 déc.  13 18:39 TSI_19-20
    drwxrwxrwx 1 root root   4096 oct.  30 01:30 TSI_spe_doc
    drwxrwxrwx 1 root root   4096 déc.  11 20:17 TSI_sup_doc
    Donc subprocess fonctionne.

    Citation Envoyé par marco056 Voir le message
    Avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import subprocess
    recherche="circuit"
    repertoire = "/media/marco5/Disque-4To/TSI_Phys"
    p = subprocess.Popen(['/bin/sh', '-c', 'pdfgrep %s -r %s'%(recherche,repertoire)])
    print(p)
    j'obtiens ce résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <subprocess.Popen object at 0x7f12900ee780>
    Si je ne mets pas le p = et le print, aucune sortie...
    Déjà c'est normal que si tu affiches "p", tu obtiennes son contenu qui est bien un objet subprocess.Popen. J'espère que tu ne t'attendais pas à y retrouver le contenu du stdout de la commande qui était exécutée. Ce que tu vois avec "ls -l" c'est son exécution à l'écran, c'est pas issu du print(p). Pour t'aider à chercher la cause, je pars de l'hypothèse que "pdfgrep" donnera naturellement lui-aussi une sortie écran.

    Ensuite 2 choses
    1. pourquoi tu t'obstines à vouloir mettre ton pdfgrep dans un sous-shell ? Ce n'est pas que ça ne fonctionnerait pas mais d'une part je trouve ça inutile, et d'autre part quand on teste un truc, on essaye d'être le plus proche du truc pour pouvoir éliminer toute cause indirecte d'erreur. Quand je t'ai demandé de tester "ls -l", tu n'as pas écrit "sh -c ls -l" !!!
    2. pourquoi tu tentes de mettre les arguments de pdfgrep dans la string que subprocess considère comme la string du programme à invoquer ? subprocess sait parfaitement gérer les arguments d'un programme => subprocess.Popen(("pdfgrep", recherche, "-r", repertoire)).
    3. et aussi pourquoi tu utilises une liste là où un tuple suffit (bon ok 3 choses et pas 2)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Pour les deux derniers points, tu as raison.
    J'ai fait de multiples tentatives.
    Celle-ci, comme les autres, ne donne aucun affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.Popen(("pdfgrep", recherche, "-r", repertoire))
    Pour le premier point, c'est le sh ? En fait j'ai testé pas mal de choses et celle-ci semblait mieux fonctionner. Je ne connais pas les sous-shell..

  6. #6
    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,

    Essaye comme ceci pour voir ce qu'il en sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    data, error = subprocess.Popen(["pdfgrep", recherche, "-r", repertoire], 
                                        universal_newlines=True, 
                                        stdout=subprocess.PIPE).communicate()
     
    if data is not None:
        for d in data.split("\n"):
            print(">> %s" % d)
     
    else:
        print("Error %s " % error)

  7. #7
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Merci VinsS.
    Le résultat est complètement différent mais je ne comprends pas ce qui se passe :
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pdfgrep: Could not open /media/marco5/Disque-4To/TSI_PhysTSI_19-20/
    Le souci, c'est que j'ai eu le même résultat dans le terminal.
    Du coup, je me suis demandé si le probleme était lié à l'ouverture d'un disque autre.
    J'ai remplacé repertoire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    repertoire = "/home/marco5/Documents"
    et cela fonctionne.
    Merci, je vais essayer de comprendre le code...

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Citation Envoyé par marco056 Voir le message
    Bonsoir, j'ai une commande qui fonctionne dans le terminal Ubuntu :
    J'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pdfgrep: Could not open /media/marco5/Disque-4To/TSI_PhysTSI_19-20/
    Le souci, c'est que j'ai eu le même résultat dans le terminal.
    Putain sans déconner quoi, tu commences en nous disant "la commande fonctionne" puis 5 posts plus loin tu rajoutes "ah oui au fait la commande m'a renvoyé un message d'erreur" !!!
    Je crois qu'on n'a pas la même notion de "ça fonctionne" !!!

    Citation Envoyé par marco056 Voir le message
    Je ne connais pas les sous-shell..
    Le shell c'est le nom de ton environnement de travail, celui où tu tapes tes commandes. Un bête programme qui attend que tu tapes une commande et se charge de l'exécuter.
    Sauf que c'est pas aussi simpliste. Chaque commande qui s'exécute commence par générer un autre shell identique qu'on appelle "fils" du shell qui a invoqué la commande. Ce dernier (le père donc) se met en attente jusqu'à ce que son fils ait fini.
    Ensuite le code d'exécution du shell fils est remplacé par le code de la commande à exécuter.
    Ca semble complexe et idiot mais en réalité ça offre plein d'avantages dont le premier est de pouvoir invoquer une commande en mode "arrière plan" (ie ls -l &) ce qui demande au père de ne pas attendre la fin du fils. Ton environnement lance le processus mais comme il n'attend pas sa fin il te rend la main ce qui te permet de faire autre chose (mais la commande s'exécute quand-même à l'écran ce qui peut géner sauf si on la redirige).

    Donc si en appelant "pdfgrep" (ou n'importe quoi d'autre) ça ouvre un shell fils qui lui se charge d'exécuter réellement "pdfgrep", pourquoi surcharger en rajoutant un shell intermédiaire pour lui demander "ouvre pdfgrep". Ca marche oui mais ça ne sert à rien.
    En fait je ne sais même pas à quelle occasion on a besoin d'encapsuler l'appel d'une commande dans un shell intermédiaire...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Calmos Sver@r...
    Cela fonctionnait très bien, sinon, je n'aurais pas écrit que c'était ok.
    C'est simplement au démarrage ce matin qu'il y a eu un message.
    Je pense mais je ne suis pas certain, que c'est lié au montage des différents disques durs au démarrage.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par marco056 Voir le message
    C'est simplement au démarrage ce matin qu'il y a eu un message.
    Je pense mais je ne suis pas certain, que c'est lié au montage des différents disques durs au démarrage.
    Donc (pour en revenir à ton premier post où tu veux apprendre à utiliser subprocess), le premier pas est de tester subprocess avec une commande qu'on maitrise (j'ai utilisé "ls -l" car c'est une généralement des plus classiques). Le second est de tester avec pdfgrep mais sur des dossiers maitrisés (donc pas issus de périphériques amovibles).
    Ensuite, quand tout est ok et que tu gères bien cette librairie, là tu peux y aller avec tes vrais dossiers.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Bonsoir,
    Tu as raison mais comme j'avais déjà utilisé subprocess, j'étais confiant.
    Par ailleurs, le media n'est pas amovible, c'est un disque dur interne et comme il est en principe monté au démarrage, je n'ai pas pensé à cela. Je ne sais toujours pas si c'est bloquant, je vais creuser la question la semaine prochaine.
    Merci à vous en tous cas pour vos idées.

Discussions similaires

  1. création de base mySQL avec python
    Par preacher_man dans le forum Bibliothèques tierces
    Réponses: 7
    Dernier message: 23/06/2006, 19h38
  2. Manipuler un fichier excel avec python
    Par dipajero dans le forum Général Python
    Réponses: 4
    Dernier message: 09/02/2006, 23h14
  3. cmt se connecté a oracle pour faire une requete avec python
    Par dipajero dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 28/12/2005, 20h22
  4. Réponses: 2
    Dernier message: 19/12/2005, 13h15
  5. Les 128 derniers bits d'un fichier en ligne avec Python ?
    Par ecocentric dans le forum Réseau/Web
    Réponses: 7
    Dernier message: 26/09/2005, 12h40

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