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 :

Python 3 - os.system sous OS X 10.6


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut Python 3 - os.system sous OS X 10.6
    Bonjour,

    Je voudrai automatiser l'utilisation de la commande convert d'ImageMagick pour convertir automatiquement toutes les images d'un dossier d'un certain format, dans un autre format.

    J'ai essayé ceci, et visiblement, cela ne fonctionne pas:

    for image in os.listdir(chemin_initial):
    commande="#!/bin/sh sh convert "+chemin_initial+image+" "+chemin_initial+nom_sortie+"."+format_sortie
    os.system(commande)


    J'avais déjà utilisé la commande os.system sous Vista et Linux pour compiler des scripts bash, et tout marchait bien. Là j'avoue que je comprends pas.

    Si vous avez des idées ou déjà rencontrés cela, je suis preneur!

    Python 3.0.1 sur Mac OS-X 10.6

  2. #2
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Si ce n'est que j'aurais utilisé convert directement (sans "#!/bin/sh sh") qu'elle est votre erreur ? Que voulez vous dire par 'ne fonctionne pas' ?

    @+

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Avec ou sans le #!bin/sh sh, le résultat est le même... rien.
    Le programme s'exécute mais ne renvoie ni erreur ni fichiers convertis.
    Lorsque je l'exécute en ligne de commande dans le shell Python, il me renvoie par contre une valeur numérique (de mémoire dans les 35000), mais pas d'erreur.

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Citation Envoyé par cckinc Voir le message
    Lorsque je l'exécute en ligne de commande dans le shell Python, il me renvoie par contre une valeur numérique (de mémoire dans les 35000), mais pas d'erreur.
    Que donne un print(commande) avent l'os.system ?

  5. #5
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    chemin_initial+image
    ou encore

    chemin_initial+nom_sortie+"."+format_sortie
    ne sont pas des chemins valides (pas de séparateur entre le nom du répertoire et le nom (simple) du fichier image. Regarde du côté de os.path.join

    De plus, la commande commençant par "#!/bin/sh sh ..." est - je n'en sais rien - peut être valide mais complétement inutile.

    os.system(commande) c'est demander au système d'executer commande, comme si on la tapait dans une fenêtre Terminal. Quand tu lances directement convert dans un terminal, tu lances "#!/bin/sh sh convert .." ? ça m'étonnerait. Là, comme tu l'écris, c'est un mille-feuilles de shells :

    • os.system : déclenchera un premier shell
    • #!/bin/sh : second shell (tu demandes que la suite soit interprétée par /bin/sh
    • sh : troisième shell



    Enfin, os.system ne te renvoie qu'un code retour. N'attends pas autre chose.

    [EDIT] mon histoire de mille-feuilles et de shells les uns à la suite des autres est, théoriquement, ce qui se passerait avec ton approche mais de toute façon, convert est un binaire et tu ne peux pas demander qu'il soit interprété par le shell donc aucune chance que ça marche ("/bin/sh convert" a autant de sens que "python convert" ...)

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    C'est bien mon avis aussi mais
    Citation Envoyé par cckinc Voir le message
    Avec ou sans le #!bin/sh sh, le résultat est le même... rien.
    Il y a aussi un string mal formé avec commande...

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Un print(commande) donne bien une chaîne de caractère et la valeur souhaitée, et qui fonctionne bien lorsqu'on réalise un copier/coller dans le terminal Mac de cette commande obtenue par concaténation.

    J'ai essayé aussi en "forçant" avec un convert(str(commande)).

    Lorsque je réalise un os.system(commande de conversion) en ligne de commande, je récupère 32512 comme valeur!

    Je pense à un problème de droit, mais je vois pas pourquoi il y en aurait et surtout comment le résoudre d'autant que je suis bien en lecture/écriture/exécution pour tous les dossiers concernés.

    Ex-ubuntiste, je me suis même amusé en accolant des su et sudo dans os.system(), sans plus de résultats.

    J'ai l'impression que Python n'arrive pas à lancer le Terminal.

    Un os.popen("/Applications/Utilities/Terminal.app") en ligne de commande donne <os._wrap_close object at 0x15ac7b0>, et je sais pas comment utiliser un os.popen() en passant pour paramètre une commande à exécuter dans le Terminal.

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 049
    Par défaut
    os.system est remplacé par le module subprocess

    Vous pouvez utiliser la méthode call si vous avez des arguments.

    Bonne continuation...

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Je rajouterai que un os.system("mkdir dossier_quelconque") me renvoie 0 lors d'une exécution en ligne de commande.

    Je creuse depuis quelques minutes la piste des problème d'écriture des chemins lors de la concaténation, mais cela ne vient pas de là je pense. Comme je l'ai dit plus haut, la commande qui s'écrit dans Python fonctionne lorsque je l'injecte à la main dans le Terminal.

    A moins qu'il n'y ait une histoire de / et \ ?

  10. #10
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    je récupère 32512 comme valeur!
    En interactif, os.system ne fait pas que retourner le code retour de la commande. Tout message sur stdout ou stderr généré par la commande s'affiche aussi. Qu'obtiens-tu ?

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Je ne connais pas ces fonctions...
    Comment dois-je les utiliser pour vous aider dans votre analyse de mon problème?

  12. #12
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Il ne s'agit pas de fonctions. stdout est la sortie standard, stderr est la sortie d'erreur standard.

    Si le shell ou la commande lancée rencontre un problème, très souvent un message d'erreur est affiché. En utilisant os.system sous l'interpréteur Python, dans une fenêtre Terminal, tu obtiens, non seulement un code retour, mais aussi des trucs comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> os.system('convert toto.png /toto.jpg')
    convert: impossible d'ouvrir l'image `/toto.jpg':  @ error/blob.c/OpenBlob/2587.
    256
    >>> 
    >>> os.system('convert toto.png /existe_pas/toto.jpg')
    convert: impossible d'ouvrir l'image `/existe_pas/toto.jpg':  @ error/blob.c/OpenBlob/2587.
    256
    >>> 
    >>> os.system('/bin/sh convert toto.png /toto.jpg')
    /bin/sh: 0: Can't open convert
    32512
    Ce sont ces messages d'erreurs qui peuvent aider à voir d'où vient le problème.

  13. #13
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    OK!

    Pour ma part, je n'ai en réponse, que la valeur 32512, et rien d'autre.

  14. #14
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Tu ne veux vraiment pas poster du code utilisable ? J'ai encore des doutes sur la validité de la commande que tu mets dans os.system.

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Tu as raison...

    Voilà le bout de code que j'essaie de faire fonctionner.
    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
     
    import os
     
    chemin_initial="../../Desktop/convert_image/atraiter/"
    chemin_sortie="../../Desktop/convert_image/resultat/"
     
    format_sortie=input("Format de sortie de l'image?")
    nom_sortie=input("Nom commun pour l'image finale?")
     
    i=0
    for image in os.listdir(chemin_initial):
        commande="convert "+chemin_initial+image+" "+chemin_sortie+nom_sortie+str(i)+"."+format_sortie
        print(commande)
        print(type(commande))
        os.system(str(commande))
        i=i+1
    Qui me renvoie ainsi:

    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
     
    >>> 
    Format de sortie de l'image?eps
    Nom commun pour l'image finale?toto
    convert ../../Desktop/convert_image/atraiter/*-0.png ../../Desktop/convert_image/resultat/toto0.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-1.png ../../Desktop/convert_image/resultat/toto1.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-2.png ../../Desktop/convert_image/resultat/toto2.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-3.png ../../Desktop/convert_image/resultat/toto3.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-4.png ../../Desktop/convert_image/resultat/toto4.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-5.png ../../Desktop/convert_image/resultat/toto5.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-6.png ../../Desktop/convert_image/resultat/toto6.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-7.png ../../Desktop/convert_image/resultat/toto7.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-8.png ../../Desktop/convert_image/resultat/toto8.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/.DS_Store ../../Desktop/convert_image/resultat/toto9.eps
    <class 'str'>
    >>>
    Sans qu'un résultat soit produit dans le répertoire resultat dans lequel j'attends la sortie.

    et si je copie/colle une des expressions générée, comme par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convert ../../Desktop/convert_image/atraiter/*-8.png ../../Desktop/convert_image/resultat/toto8.eps
    dans le Terminal de mon Mac, la conversion s'opère sans soucis.


    Y'a un truc qui m'échappe, mais quoi...

  16. #16
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Mais pourquoi diable s’obstiner à utiliser os.system, qui n’est plus recommandé par python, et pas le nouveau module subprocess*?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import subprocess
     
    chemin_initial = "../../Desktop/convert_image/atraiter/"
    chemin_sortie = "../../Desktop/convert_image/resultat/"
     
    format_sortie = input("Format de sortie de l'image?")
    nom_sortie = input("Nom commun pour l'image finale?")
     
    i = 0
    for image in os.listdir(chemin_initial):
        commande = ["convert", chemin_initial+image, chemin_sortie+nom_sortie+str(i)+"."+format_sortie]
        subprocess.call(commande)
        i += 1
    C’est censé être nettement plus robuste/fiable que os.system (pas de Mac sous la main pour tester, ceci-dit).

  17. #17
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    En exécutant ta proposition, j'obtiens ça
    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
     
    >>> 
    Format de sortie de l'image?eps
    Nom commun pour l'image finale?toto
    Traceback (most recent call last):
      File "/Users/XXX/Desktop/convert_image/conversion_bis.py", line 17, in <module>
        subprocess.call(commande)
      File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/subprocess.py", line 399, in call
        return Popen(*popenargs, **kwargs).wait()
      File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/subprocess.py", line 594, in __init__
        errread, errwrite)
      File "/Library/Frameworks/Python.framework/Versions/3.0/lib/python3.0/subprocess.py", line 1097, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    >>>

  18. #18
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Dis, et si tu essayais avec des chemins absolus, plutôt que des relatifs comme "../../Desktop/convert_image/atraiter/"*? Pasque les relatifs, si on maîtrise pas par rapport à quoi qu’y sont relatifs, ben…

  19. #19
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 12
    Par défaut
    Non je l'ai exécuté avec des chemins absolus et relatifs, et c'est le même résultat...

  20. #20
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Je reviens sur le bout de code du post#15 (je laisse de côté le débat os.system vs subprocess.call, ça ne vient visiblement pas de là)

    Comment le "print(commande)" du code :

    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
    import os
     
    chemin_initial="../../Desktop/convert_image/atraiter/"
    chemin_sortie="../../Desktop/convert_image/resultat/"
     
    format_sortie=input("Format de sortie de l'image?")
    nom_sortie=input("Nom commun pour l'image finale?")
     
    i=0
    for image in os.listdir(chemin_initial):
        commande="convert "+chemin_initial+image+" "+chemin_sortie+nom_sortie+str(i)+"."+format_sortie
        print(commande)
        print(type(commande))
        os.system(str(commande))
        i=i+1
    peut-il produire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Format de sortie de l'image?eps
    Nom commun pour l'image finale?toto
    convert ../../Desktop/convert_image/atraiter/*-0.png ../../Desktop/convert_image/resultat/toto0.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-1.png ../../Desktop/convert_image/resultat/toto1.eps
    <class 'str'>
    convert ../../Desktop/convert_image/atraiter/*-2.png ../../Desktop/convert_image/resultat/toto2.eps
    <class 'str'>
    etc ...
    ?

    Tu as recopié des bouts de code et/ou de résultat ou as-tu réellement des fichiers de noms "*-0.png", "*-1.png" dans le répertoire à traiter ?

    Parce que le '*' sous Linux/Mac, ça n'a rien d'innoncent ! (faut même faire des efforts pour créer des fichiers avec un nom de ce style c'est vrai sous le shell qui interprète '*' mais pas en python)

    Qu'en est-il ?

Discussions similaires

  1. appel systeme sous mandriva 2006
    Par yashiro dans le forum Linux
    Réponses: 1
    Dernier message: 12/01/2007, 15h03
  2. [C++] Comment effectuer l'appel system sous pocket pc ?
    Par Startux dans le forum Windows Mobile
    Réponses: 8
    Dernier message: 20/07/2006, 10h43
  3. Tuer un processus lance par system sous perl
    Par gedeon555 dans le forum Langage
    Réponses: 4
    Dernier message: 10/04/2006, 17h11
  4. Programmation systeme sous Unix
    Par Premium dans le forum Linux
    Réponses: 9
    Dernier message: 11/03/2006, 09h40
  5. [Kylix] pb avec le Libc.system sous redhat
    Par zheng dans le forum EDI
    Réponses: 1
    Dernier message: 15/07/2004, 10h58

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