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. #21
    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
    parce que, avec de tels noms de fichiers, j'obtiens des choses comme ç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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    plx@satellite:~/Bureau/a_traiter$ python3
    Python 3.2.3 (default, Sep 10 2012, 18:17:42) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import subprocess
    >>> import os
    >>> 
    >>> i = 0
    >>> for image in os.listdir('.'):
    ...     commande = 'convert %s res-%d.jpg' % (image,i)
    ...     subprocess.call(commande)
    ...     i += 1
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 3, in <module>
      File "/usr/lib/python3.2/subprocess.py", line 471, in call
        return Popen(*popenargs, **kwargs).wait()
      File "/usr/lib/python3.2/subprocess.py", line 745, in __init__
        restore_signals, start_new_session)
      File "/usr/lib/python3.2/subprocess.py", line 1361, in _execute_child
        raise child_exception_type(errno_num, err_msg)
    OSError: [Errno 2] No such file or directory: 'convert *-0.png res-0.jpg'
    >>> 
    >>> os.listdir('.')
    ['*-0.png', '*-1.png']
    >>> 
    >>> i = 0
    >>> for image in os.listdir('.'):
    ...     commande = 'convert %s res-%d.jpg' % (image,i)
    ...     os.system(commande)
    ...     i += 1
    ... 
    0
    0
    >>> os.listdir('.')
    ['res-0.jpg', '*-0.png', 'res-1.jpg', '*-1.png']
    >>>
    on remarque que la commande exécutée avec os.system ou subprocess.call ne produit pas le même résultat (pourquoi ?). Je ne pense pas qu'il y ait de différence ubuntu/mac (j'ai bien un mac sous 10.6 mais pas de python3 installé)

  2. #22
    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
    Citation Envoyé par plxpy
    on remarque que la commande exécutée avec os.system ou subprocess.call ne produit pas le même résultat (pourquoi ?)
    parce qu'on (mont29 et moi) a oublié le "shell=True" dans call

    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
    plx@satellite:~/Bureau/a_traiter$ python3
    Python 3.2.3 (default, Sep 10 2012, 18:17:42) 
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os, subprocess
    >>> os.listdir('.')
    ['*-0.png', '*-1.png']
    >>> i=0
    >>> for image in os.listdir('.'):
    ...     commande = "convert %s res-%d.jpg" % (image,i)
    ...     subprocess.call(commande, shell=True)
    ...     i = i + 1
    ... 
    0
    0
    >>> os.listdir('.')
    ['res-0.jpg', '*-0.png', 'res-1.jpg', '*-1.png']
    N'empêche que je te déconseille fortement d'utiliser le caractère '*' dans les noms de fichiers. C'est une source de problèmes.

    Donc, on n'est pas avancé...

    Par contre, ta philo de prendre TOUS les fichiers retournés par os.listdir et de les considérer comme des fichiers image n'est pas terrible. Sous MacOSX, tu as des fichiers .DS_store qui trainent dans les répertoires (c'est pour le Finder (le navigateur de fichiers Mac)). D'ailleurs tu récupères aussi les répertoires.

    Et sous Linux tu auras le même problème si le répertoire à traiter contient des fichiers (ou des répertoires) cachés. C'est plus rare, moins systématique que sous MacOSX (.DS_store) mais quand même.

    Avec os.listdir, tu les récupères... et tu tentes de les convertir.

    Utiliser glob.glob avec les extensions correspondant à des formats images serait sans doute meilleur

  3. #23
    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
    Mes fichiers s'appellent effectivement *-XX.png car je les avais mal passés à une moulinette de conversion de type directement dans le terminal et c'est ainsi que ces noms ont été générés. Je sais que le "*" a effectivement un sens dans une console Linux/DOS/Mac mais vu que ça ne posait pas problème lorsque je travaillais directement dans un terminal, je voyais pas pourquoi cela m'en générerait ici.

    Je viens de tous les renommer avec des noms plus standards, et chemins relatifs ou absolus, j'ai toujours le même problème... ça compile, pas d'erreurs de renvoyées et pas de fichiers convertis non plus.

    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
     
    import os
     
    chemin_initial="atraiter/"
    chemin_sortie="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):
        #print(image)
        #depart=os.path.join(chemin_initial,image)
        #print(depart)
        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
    et la sortie python:

    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 atraiter/.DS_Store resultat/toto0.eps
    <class 'str'>
    convert atraiter/img-0.png resultat/toto1.eps
    <class 'str'>
    convert atraiter/img-1.png resultat/toto2.eps
    <class 'str'>
    convert atraiter/img-2.png resultat/toto3.eps
    <class 'str'>
    convert atraiter/img-3.png resultat/toto4.eps
    <class 'str'>
    convert atraiter/img-4.png resultat/toto5.eps
    <class 'str'>
    convert atraiter/img-5.png resultat/toto6.eps
    <class 'str'>
    convert atraiter/img-6.png resultat/toto7.eps
    <class 'str'>
    convert atraiter/img-7.png resultat/toto8.eps
    <class 'str'>
    convert atraiter/img-8.png resultat/toto9.eps
    <class 'str'>
    >>>
    Dans un terminal directement ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Last login: Tue Oct  2 10:39:36 on console
    MacBook-Pro-de-XXX:~ XXX$ cd Desktop
    MacBook-Pro-de-XXX:Desktop XXX$ cd convert_image
    MacBook-Pro-de-XXX:convert_image XXX$ convert atraiter/img-1.png resultat/img-1.eps
    MacBook-Pro-de-XXX:convert_image XXX$
    l'image étant bien générée là où j'ai envie...

    Je crois que le problème vient d'un manque de communication entre Python et le Terminal, mais je sais pas où ni comment ni pourquoi.

    J'ai d'autres scripts Python (en 2.x) qui utilisait des appels de terminaux lorsque je travaillais sur Linux (création de vignettes jpg de textes LaTeX par exemple), qui sont inopérants aussi, sûrement pour la même raison...

  4. #24
    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 passe 90% de mon temps sur un MacPro, sous 10.6 (snow leopard), en Python (2.6 ou 2.7, il est vrai) et je n'ai pas ce genre de de problème en travaillant exclusivement dans un Terminal (soit, sous le shell, en lancant des scripts, soit en interactif)

    Je suis étonné qu'aucun code retour ne soit affiché dans ce que tu postes (à cause du "os.system(str(commande))". Seuls les résultats de tes "print" apparaissent. Particularité python3 ? (connais pas bien)

    Es-tu allé "bidouiller" les préférences de Terminal pour que l'interpréteur lancé ne soit pas la valeur par défaut ? (/bin/bash)

    Et sinon, ma dernière remarque concernant les fichiers/répertoires cachés se vérifie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    convert atraiter/.DS_Store resultat/toto0.eps
    <class 'str'>
    provoquant (si ça fonctionnait) un décalage de numéros entre tes images avant et après conversion.


    A part ça, je suis sec !

  5. #25
    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
    Actuellement je m'en sors avec ce petit script shell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #!/bin/bash
    for file in *.png; do convert $file $file.eps ; done
    mais c'est moins maléable surtout si je veux changer le format d'entrée ou de sortie et pourquoi pas, les dossiers de destination ou initiaux.

  6. #26
    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
    la traduction mot à mot de ton shell script corrigé (je ne pense pas que pour un fichier toto.png tu souhaites avoir un fichier toto.png.eps) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    for file in *.png
    do
       convert $file `echo $file | cut -f1 -d'.'`.eps
    done
    est (python 2.6 ou 2.7 à cause de subprocess)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env python
    import subprocess
    import glob
    for file in glob.glob('*.png'):
        commande = 'convert %s %s.eps' % (file, file.split('.')[0])
        subprocess.call(commande, shell=True)
    Est-ce que ça fonctionne ?

  7. #27
    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
    Pas plus qu'avant...

  8. #28
    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
    J'ai installé une version 3 sur un Mac en 10.6 cette semains et ça fonctionne sans problème. Je ne peux pas t'aider plus (surtout avec le peu de renseignements que tu fournis). Mais ne cherche pas du côté d'une "particularité" liée à MacOSX sur ce point (os.system ou subprocess.call) : il n'y en a pas.

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