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 :

Résultat d'une commande system (bash)


Sujet :

Python

  1. #1
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut Résultat d'une commande system (bash)
    Bonjour,

    imagequick propose une outil (compare) qui permet de comparer pixel par pixel deux images.

    Par exmple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compare -metric AE A.png B.png /dev/null
    Donc 0 si tous les pixels de A.png sont identiques aux pixels de B.png. Et un entier indiquant le nombre de pixels divergeant le cas échéant.

    Si en python je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = os.system("compare -metric AE A.png B.png /dev/null")
    J'obtiens 0 si les deux images sont comparables, et pas le résultat.

    J'ai testé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    result = os.popen("compare -metric AE A.png B.png /dev/null").read()
    if result !="0":
      print ("Images différentes")
    Le problème est que le test réussit systématiquememt, même lorsque les deux images sont exactement les mêmes (genre j'ai dupliqué l'image et je les compare).

    J'avoue ne pas comprend comment fonctionne os.popen() et le type de résultats.

    Merci d'avance pour votre aide.

  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,

    Si tu essayes comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cmd = ["compare", "-metric", "AE", "A.png", "B.png"]
    reply = subprocess.Popen(cmd, universal_newlines=True, 
                             stdout=subprocess.PIPE).communicate()
    print(reply)
    ça donne quoi ?

    Normalement un tuple, mais bon...

  3. #3
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut
    Cela me donne
    ('', None)
    Que l'image soit identique ou pas.

  4. #4
    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
    Oui, communicate retourne toujours un tuple dont le premier terme est le retour de la commande et le second est l'erreur s'il en est.

    Donc None veut dire qu'il n'y a pas d'erreur mais la chaîne vide veut dire que ta commande ne retourne rien.

    Tu n'as pas rajouté "/dev/null" à la commande hein ? faut pas.

    Tu peux coller ici le man de imagequick, ou un lien doc ?

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

    La différence entre os.system et os.popen et que l'un retourne le status de sortie du process (un "petit" entier) alors que l'autre retourne ce qui a été écrit dans le stdout du process (une chaîne de caractères): il suffit d'ouvrir la documentation pour le savoir et y lire aussi les recommandations pour utiliser subprocess plutôt que ces fonctions là.

    Si le contenu des chaînes de caractères est plus facile à lire pour les humains, les analyser avec un programme, c'est plus compliqué... C'est ce qui fait préférer la récupération du status de sortie (moins ambigu).... Donc on préférera (dans ce cas) utiliser le remplacement d'os.system qui est subprocess.call.

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

  6. #6
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut
    J'ai utilisé la réponse ici
    http://stackoverflow.com/a/43799726/3206025

    Si j'execute la commande directement dans mon bash "ca marche"

  7. #7
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut
    @wiztricks j'avais bien compris la différence. C'est pour cela que j'ai voulu utiliser popen, pour avoir le stdout. Mais justement, ce que je ne comprend pas c'est que je n'ai pas un "0" dans le retour, alors qu'executé directement en bash, j'ai bien un "0".

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par maieul Voir le message
    @wiztricks j'avais bien compris la différence. C'est pour cela que j'ai voulu utiliser popen, pour avoir le stdout. Mais justement, ce que je ne comprend pas c'est que je n'ai pas un "0" dans le retour, alors qu'executé directement en bash, j'ai bien un "0".
    Et ben, dans la documentation d'Imagequick compare on y lit:
    The compare program returns 2 on error otherwise 0 if the images are similar or 1 if they are dissimilar.
    .
    Vous vérifiez que ces "status" sont bien retournés en lançant le programme sous "bash" (le status sous bash c'est pas ce que çà affiche hein..)
    Et vous essayez de récupérer (et faire avec...) en utilisant subprocess.call.

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

  9. #9
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut
    Hum, tu as raison, je ne sais pas pourquoi hier soir je n'arrivais pas à ce résultat.

    Par contre je ne suis pas sûr de comprendrer la dernière phrase: est-ce que tu décrits ce que je fais, ou bien ce que je devrais faire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = os.system(command)
    me retourne 0 si mes images sont identiques, et autres choses si différentes -> cela me suffit.

    Par contre ce que je ne comprend pas est que le résultats est aussi affiché dans ma console.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par maieul Voir le message
    Par contre je ne suis pas sûr de comprendrer la dernière phrase: est-ce que tu décrits ce que je fais, ou bien ce que je devrais faire?
    Je raconte ce que vous devriez faire... i.e. vérifier que la commande "compare" fonctionne comme le raconte la documentation sous bash puis faire la même chose avec subprocess.call.

    Citation Envoyé par maieul Voir le message
    Par contre ce que je ne comprend pas est que le résultats est aussi affiché dans ma console.
    Il faut bien que çà aille quelque part... et le stdout du parent étant là "par défaut"... si vous ne redirigez pas les sorties vers "null" côté commande, çà s'affiche. subprocess.call contrôle déjà tout çà.

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

  11. #11
    Membre habitué

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Par défaut
    Décidement il y a quelque chose que je ne comprend pas

    Je croyais que os.system subprocess.call retournait le résultat de la commande.
    Si je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    result = subprocess.call(compare -metric AE A.png B.png /dev/null)
    Le résultat devrait aller dans result (c'est le cas) et du coup ne pas s'afficher (ce n'est pas le cas) non?

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 715
    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 715
    Par défaut
    Citation Envoyé par maieul Voir le message
    Le résultat devrait aller dans result (c'est le cas) et du coup ne pas s'afficher (ce n'est pas le cas) non?
    Ce qui va dans "result" est une information véhiculée par le système qui ne s'affiche pas. Ce qui s'affiche est ce que la commande bash écrit sur stdout/stderr. Ce qui est sur c'est que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compare -metric AE A.png B.png /dev/null
    ne redirige rien vers /dev/null.
    Et que subprocess.call (par défaut) ne le fait pas non plus.
    note: amusez vous à lancer la commande "ls" sous la console Python pour voir ce qu'il se passe.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. sed et résultat d'une commande bash
    Par Spirale21 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 19/11/2013, 23h43
  2. [bash] Substituer le résultat d'une commande dans une variable en texte
    Par Erculpoiro dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 14/05/2013, 11h24
  3. bash: comment mettre le résultat d'une commande dans une variable
    Par helpcomm dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 03/10/2012, 23h26
  4. Comment recevoir en directe le résultat d'une commande systeme en C++/C?
    Par Elv13 dans le forum Administration système
    Réponses: 17
    Dernier message: 02/06/2008, 16h16
  5. Ecrire le résultat d'une commande dans un fichier de l' OS
    Par Labienus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/02/2004, 11h04

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