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 programmer ls -al |more (avec os.system)


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Points : 9
    Points
    9
    Par défaut python programmer ls -al |more (avec os.system)
    Bonjour,

    j'ai envie de programmer un code permettant d’exécuter la commande du shell "ls -al | more", bon je pars de l'idée de crée un tube(et de faire un fork) le père doit mettre dans le tube la commande ls -al et le fils exécute more, mais çà ne marche pas , merci de m'aider.

    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,sys
     
    (o,i)=os.pipe()
    pid=os.fork()
     
    if pid==0:
    	buf2=os.read(o,1024)
    	os.dup(i)
    	os.system("more")
    	sys.exit(0)
    else:	
    	c="ls -al"
    	os.write(i,c)
    	os.wait()
    	sys.exit(1)

  2. #2
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Si c'est avec exclusivement avec os.system
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system('ls -al | more')
    Sinon il y a subprocess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    subprocess.call("ls -Al | more", shell=True)
    @+
    Merci d'utiliser le forum pour les questions techniques.

  3. #3
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    Bonjour

    Les pistes fournies par PauseKawa sont tout à fait valables, mais là j'ai l'impression que tu veux "jouer" avec les appels système Unix/Linux (leurs correspondants Python) et construire, à la main, les deux commandes pipées.

    Mais, là, tu t'y prends mal et mélanges un peu tout.

    Globalement (et "visuellement"), ton code (que j'ai sauvegardé dans orig.py) fait ç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
    plx@sony:~$ python orig.py 
    Usage: more [options] file...
     
    Options:
      -d        display help instead of ring bell
      -f        count logical, rather than screen lines
      -l        suppress pause after form feed
      -p        suppress scroll, clean screen and disblay text
      -c        suppress scroll, display text and clean line ends
      -u        suppress underlining
      -s        squeeze multiple blank lines into one
      -NUM      specify the number of lines per screenful
      +NUM      display file beginning from line number NUM
      +/STRING  display file beginning from search string match
      -V        output version information and exit
    plx@sony:~$
    Il affiche le "help" de la commande more, exactement comme quand tu lances la commande more, sans préciser le fichier à traiter en argument ou sans que son entrée standard ait été branchée (via un pipe '|') sur la sortie d'une autre commande ou redirigée via un '<'.

    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
    plx@sony:~$ more
    Usage: more [options] file...
     
    Options:
      -d        display help instead of ring bell
      -f        count logical, rather than screen lines
      -l        suppress pause after form feed
      -p        suppress scroll, clean screen and disblay text
      -c        suppress scroll, display text and clean line ends
      -u        suppress underlining
      -s        squeeze multiple blank lines into one
      -NUM      specify the number of lines per screenful
      +NUM      display file beginning from line number NUM
      +/STRING  display file beginning from search string match
      -V        output version information and exit
    plx@sony:~$

    C'est provoquée par la ligne 9 de ton code : os.system('more').

    Problèmes dans ton code :

    attention : tes variables o et i pourraient être avantageusement remplacées par r ou (read_side) et w (ou write_side). C'est bien dans cet ordre que os.pipe retourne les file descriptors.
    Là ton 'i' c'est l'input du pipe donc là où on écrit. Ton 'o', c'est l'output du pipe, donc là où on lit ... c'est "confusionnant" !

    côté fils :

    • ligne 7 : soit ton code fait le "more" (ah ah !) et va lire dans le pipe, soit tu exécutes 'more' et c'est lui qui fait le boulot de lecture, mais pas de mélange des 2
    • ligne 8 : je ne sais pas trop quel file descriptor tu voulais dupliquer. Là, tu dupliques côté écriture (?), dans le fils censé lire (?) et qui a déjà lu à la ligne d'avant ???
    • ligne 9 : tu lances, dans un sous-process, (presque) complètement détaché du reste, un "more" (qui te provoque l'affichage du help). Aucune chance qu'il joue le jeu et prenne en compte ton pipe (qu'il ne connait pas d'ailleurs)


    côté père :

    • lignes 12 et 13 : ce que tu voudrais écrire dans le pipe, c'est la sortie standard de 'ls -al' et pas la chaine 'ls -al'



    Mais de toute façon, la philo choisie n'est pas la bonne. L'idée générale dans ce genre de cas, consiste à :

    1. créer le pipe
    2. faire un fork
    3. re-brancher stdin du fils sur le coté lecture du pipe et stdout du père sur le côté écriture du pipe
    4. substituer au process courant, un autre process exécutant la commande que tu veux lancer ('ls -al' dans le père, 'more' dans le fils)



    Pour ce faire, il faut utiliser une des fonctions de la famille des os.exec... et non pas os.system

    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
    # -*- coding:utf-8 -*-
     
    import os
    import sys
     
    # création du pipe, récupération des descripteurs (lecteur et écriture)
    read_side, write_side = os.pipe()
     
    # dédoublement (fork) du process courant
    fpid = os.fork()
     
    if fpid:    # process pere
     
        # stdout (1) fermée puis rebranchée au pipe, coté écriture :
        #
        # # fermeture de la sortie standard
        # os.close(sys.stdout.fileno())
        #
        # # duplication du file descriptor
        # # (le + petit file descriptor libre - ici 1) est utilisé 
        # os.dup(w)
        #
        # ou en raccourci :
     
        os.dup2(write_side,sys.stdout.fileno())
     
        # substitution avec un process executant "ls -al"
        os.execlp("/bin/ls","ls","-al")
     
    else:       # process fils
     
        # stdin (0) fermée puis rebranchée au pipe, coté lecture
        # (principe analogue à celui utilisée dans le père)
        os.dup2(read_side,sys.stdin.fileno())
     
        # substitution avec un process executant "more"
        os.execlp("/bin/more","more")
    A l'exécution :

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    plx@sony:~$ python ls_al_pipe_more.py 
    total 3024
    drwxr-xr-x 37 plx  plx     4096 mai   30 06:35 .
    drwxr-xr-x  3 root root    4096 mai    8 09:25 ..
    drwx------  3 plx  plx     4096 mai    8 09:40 .adobe
    -rw-rw-r--  1 plx  plx      107 mai   13 06:27 .apport-ignore.xml
    -rw-------  1 plx  plx    11560 mai   30 04:13 .bash_history
    -rw-r--r--  1 plx  plx      220 mai    8 09:25 .bash_logout
    -rw-r--r--  1 plx  plx     3876 mai   12 10:42 .bashrc
    -rw-r--r--  1 plx  plx     3876 mai   12 10:42 .bashrc~
    drwxrwxr-x  4 plx  plx     4096 mai   12 10:49 bin
    drwxr-xr-x  3 plx  plx     4096 mai   29 21:58 Bureau
    drwx------ 10 plx  plx     4096 mai   30 05:47 .cache
    drwx------ 17 plx  plx     4096 mai   17 09:44 .config
    drwx------  3 plx  plx     4096 mai    8 09:38 .dbus
    -rw-r--r--  1 plx  plx       27 mai   30 05:47 .dmrc
    drwxr-xr-x  2 plx  plx     4096 mai    8 09:38 Documents
    drwxr-xr-x  2 plx  plx     4096 mai   11 21:50 .fontconfig
    drwx------  3 plx  plx     4096 mai   30 05:47 .gconf
    drwx------  4 plx  plx     4096 mai   11 21:50 .gegl-0.0
    drwxr-xr-x 22 plx  plx     4096 mai   26 12:21 .gimp-2.6
    drwx------  3 plx  plx     4096 mai    8 09:40 .gnome2
    -rw-------  1 plx  plx        0 mai   13 00:11 .goutputstream-0Q46DW
    -rw-------  1 plx  plx        0 mai   29 06:18 .goutputstream-1IEAFW
    -rw-------  1 plx  plx        0 mai    8 23:16 .goutputstream-22MSDW
    -rw-------  1 plx  plx        0 mai   15 09:02 .goutputstream-2FLCEW
    -rw-------  1 plx  plx        0 mai   30 04:14 .goutputstream-3HQ2EW
    -rw-------  1 plx  plx        0 mai   29 14:00 .goutputstream-7024EW
    -rw-------  1 plx  plx        0 mai   12 05:30 .goutputstream-9322DW
    -rw-------  1 plx  plx        0 mai   29 08:34 .goutputstream-GDAEFW
    -rw-------  1 plx  plx        0 mai   26 09:20 .goutputstream-H629EW
    -rw-------  1 plx  plx        0 mai   28 19:43 .goutputstream-HDG2EW
    -rw-------  1 plx  plx        0 mai   21 07:32 .goutputstream-HG1QEW
    -rw-------  1 plx  plx        0 mai   14 08:54 .goutputstream-J1Y9DW
    -rw-------  1 plx  plx        0 mai   17 03:29 .goutputstream-LAXREW
    -rw-------  1 plx  plx        0 mai   28 10:20 .goutputstream-NDQ7EW
    -rw-------  1 plx  plx        0 mai    9 06:30 .goutputstream-QIQXDW
    -rw-------  1 plx  plx        0 mai   13 08:08 .goutputstream-R2NUDW
    -rw-------  1 plx  plx        0 mai   27 03:26 .goutputstream-ULS7EW
    drwx------  2 plx  plx     4096 mai    8 12:15 .gphoto
    drwx------  2 plx  plx     4096 mai   17 07:41 .grsync
    drwxrwxr-x  2 plx  plx     4096 mai    8 09:48 .gstreamer-0.10
    -rw-------  1 plx  plx      198 mai   17 10:00 .gtk-bookmarks
    dr-x------  2 plx  plx        0 mai   30 05:47 .gvfs
    -rw-------  1 plx  plx     1240 mai   30 05:47 .ICEauthority
    drwxrwxr-x  4 plx  plx     4096 mai   26 08:19 IGN
    drwxr-xr-x  2 plx  plx     4096 mai    8 09:38 Images
    drwxrwxr-x  3 plx  plx     4096 mai    8 13:44 .java
    drwxrwxr-x  3 plx  plx     4096 mai    8 09:38 .local
    -rw-rw-r--  1 plx  plx    10760 mai   17 10:17 log
    -rw-rw-r--  1 plx  plx      557 mai   17 10:22 log.py
    -rw-rw-r--  1 plx  plx      556 mai   17 10:21 log.py~
    -rw-rw-r--  1 plx  plx      970 mai   30 06:35 ls_al_pipe_more.py
    -rw-rw-r--  1 plx  plx      729 mai   30 06:16 ls_al_pipe_more.py~
    drwx------  3 plx  plx     4096 mai    8 09:40 .macromedia
    -rw-rw-r--  1 plx  plx      733 mai   29 22:22 manual_pipe.py~
    drwxr-xr-x  2 plx  plx     4096 mai    8 09:38 Modèles
    drwx------  5 plx  plx     4096 mai    9 05:38 .mozilla
    drwxr-xr-x  2 plx  plx     4096 mai    8 09:38 Musique
    -rw-rw-r--  1 plx  plx      372 mai   29 22:45 ooops.py
    -rw-rw-r--  1 plx  plx      287 mai   29 22:44 ooops.py~
    -rw-rw-r--  1 plx  plx      182 mai   30 06:07 orig.py
    -rw-rw-r--  1 plx  plx  2471604 mai   17 08:18 output.jp2
    -rw-rw-r--  1 plx  plx        0 mai   26 15:39 output.jp2.orage
    -rw-r--r--  1 plx  plx       32 mai    8 09:38 .pam_environment
    -rw-r--r--  1 plx  plx      675 mai    8 09:38 .profile
    drwxr-xr-x  2 plx  plx     4096 mai    8 09:38 Public
    drwx------  2 plx  plx     4096 mai   30 05:47 .pulse
    -rw-------  1 plx  plx      256 mai    8 09:38 .pulse-cookie
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  4. #4
    Membre expérimenté 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 : 59
    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
    Points : 1 481
    Points
    1 481
    Par défaut
    L'utilisation de os.fork empêche l'approche précédente sous Windows. Fonctionnellement au moins, on peut arriver à un résultat équivalent en utilisant Popen et en faisant les branchements via les paramètres stdin et stdout du constructeur.

    Un script plus général qui lit, dans ses arguments, la suite des commandes/exécutables à enchainer :

    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
    # -*- coding:utf-8 -*-
     
    import sys
    from subprocess import Popen, PIPE
     
    # les commandes/exécutables à piper
     
    commandes = sys.argv[1:]
     
    # initialisation de la liste des sous-processes avec la 1ere commande
    # (on ne s'occupe que de la sortie standard)
     
    subprocesses = [ Popen(commandes[0],shell=True,stdout=PIPE) ]
     
    # Pour les commandes suivantes, exceptée la dernière, on branche l'entrée
    # standard sur la sortie standard de la commande précédente et la sortie
    # standard est "dirigée" vers subprocess.PIPE
     
    for cmd in commandes[1:-1]:
            last_stdout = subprocesses[-1].stdout.fileno()
            sub = Popen(cmd,shell=True,stdin=last_stdout,stdout=PIPE)
            subprocesses.append(sub)
     
     
    # pour la dernière commande, seule l'entrée standard est re-branchée
     
    last_stdout = subprocesses[-1].stdout.fileno()
    subprocesses.append(Popen(commandes[-1],shell=True,stdin=last_stdout))
     
    # j'attends la fin de la dernière commande
    subprocesses[-1].wait()

    Avec numerote.py qui ne fait qu'afficher les lignes qu'il a lues, en les numérotant :

    Quelques exécutions sous Windows :

    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
    C:\Users\plx> python pipe.py dir "python numerote.py"
    1:  Le volume dans le lecteur C n'a pas de nom.
    2:  Le numéro de série du volume est 12B9-6C9B
    3: 
    4:  Répertoire de C:\Users\plx
    5: 
    6: 02/06/2012  09:09    <REP>          .
    7: 02/06/2012  09:09    <REP>          ..
    8: 05/08/2011  19:13    <REP>          .idlerc
    9: 05/08/2011  19:13    <REP>          .pdfsam
    10: 13/11/2011  12:53    <REP>          .qgis
    11: 21/01/2008  03:43    <REP>          Contacts
    12: 02/06/2012  09:09    <REP>          Desktop
    13: 30/05/2012  20:35    <REP>          Documents
    14: 01/05/2012  19:09    <REP>          Downloads
    15: 03/05/2010  07:21    <REP>          Favorites
    16: 12/02/2012  18:54    <REP>          Home
    17: 12/02/2009  12:46    <REP>          Links
    18: 14/05/2010  07:15    <REP>          Music
    19: 02/06/2012  08:33               149 numerote.py
    20: 31/12/2011  17:45    <REP>          Pictures
    21: 02/06/2012  09:00               740 pipe.py
    22: 29/11/2008  12:33    <REP>          Roaming
    23: 05/08/2011  19:14    <REP>          Saved Games
    24: 12/02/2009  12:46    <REP>          Searches
    25: 31/12/2011  11:25    <REP>          Videos
    26:                2 fichier(s)              889 octets
    27:               18 Rép(s)  85,533,151,232 octets libres
     
    C:\Users\plx> python pipe.py dir "python numerote.py" "find \".py\""
    19: 02/06/2012  08:33               149 numerote.py
    21: 02/06/2012  09:00               740 pipe.py
     
    C:\Users\plx> python pipe.py dir "find \".py\"" "python numerote.py"
    1: 02/06/2012  08:33               149 numerote.py
    2: 02/06/2012  09:00               740 pipe.py
    Et sous Linux (Ubuntu)

    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
    plx@sony:~$ python pipe.py ls "head -10" "python numerote.py"
    1: bin
    2: Bureau
    3: cat.py
    4: Documents
    5: IGN
    6: Images
    7: log
    8: log.py
    9: log.py~
    10: ls_al_pipe_more.py
    plx@sony:~$ 
    plx@sony:~$ python pipe.py ls "grep \".py$\"" "python numerote.py"
    1: cat.py
    2: log.py
    3: ls_al_pipe_more.py
    4: md5.py
    5: numerote.py
    6: ooops.py
    7: orig.py
    8: pipe.py
    9: popen_ls_al_pipe_more.py
    plx@sony:~$ 
    plx@sony:~$ python pipe.py ls "python numerote.py" "grep \".py$\"" "python numerote.py"
    1: 3: cat.py
    2: 8: log.py
    3: 10: ls_al_pipe_more.py
    4: 13: md5.py
    5: 16: numerote.py
    6: 17: ooops.py
    7: 20: orig.py
    8: 23: pipe.py
    9: 25: popen_ls_al_pipe_more.py
    plx@sony:~$
    Evidemment, ça n'a pas d'intérêt en soi. Autant utiliser le '|', aussi disponible sous DOS, pour arriver au même résultat. C'est la façon de brancher 2 à 2 les sous-processes qui est intéressante.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

Discussions similaires

  1. Programme pour un logiciel avec Python 3.2
    Par Amnael dans le forum Général Python
    Réponses: 14
    Dernier message: 12/08/2011, 10h21
  2. ouvrir un programme visual basic 2008 avec python
    Par saimyas dans le forum Interfaçage autre langage
    Réponses: 0
    Dernier message: 30/05/2011, 16h22
  3. recupérer le Pid d'un programme lancer avec os.system()
    Par GoldenEyes dans le forum Général Python
    Réponses: 10
    Dernier message: 25/01/2009, 09h16
  4. [langage] Probleme avec commande system et code
    Par Ludo167 dans le forum Langage
    Réponses: 3
    Dernier message: 14/07/2004, 12h01
  5. Réponses: 2
    Dernier message: 14/01/2004, 16h21

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