[Linux?] os.popen et retour de commande "echo"

Le
PIGUET Bruno
Bonjour,

Pour tester un petit programme qui analyse la sortie d'un programme
externe lancé avec os.popen(), j'ai eu l'idée de remplacer le programme
externe par un "/bin/echo" qui génère des chaînes spécifiques.
He bien, ça ne marche pas. Là où os.popen() récupère bien la sortie
du vrai programme, il ne récupère pas la sortie de "echo".
J'ai testé que ma commande echo était correcte en l'appelant via
os.system(). Dans ce cas, tout va bien. mais avec popen(), couic !
Avez-vous déjà rencontré ce genre de comportement ?

Voici un bout de code (presque) minimal qui reproduit le
comportement :

import os
d={}
cmd = "/bin/echo -e 'a1=b a2=c#comment'"
os.system(cmd) # Là, ça marche
for line in os.popen(cmd).readlines(): # ne semble rien voir passer ?
line
if line[0] == '#':
continue
x=line.split('=')
if len(x) == 2:
d[x[0].strip()] = x[1].strip()
d

Bruno.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Pointal
Le #600474
PIGUET Bruno wrote:

<zip>
Voici un bout de code (presque) minimal qui reproduit le
comportement :
</zip>


ChezMoiCaMarche (TM) avec ton exemple de source (et un print d à la fin pour
afficher le dico).

[ nobackup]$ python testpospen.py
a1=b
a2=c
#comment
{'a1': 'b', 'a2': 'c'}

Plateforme Mandriva Linux 2007
[ nobackup]$ python
Python 2.4.3 (#2, Oct 6 2006, 15:32:41)
[GCC 4.1.1 20060724 (prerelease) (4.1.1-3mdk)] on linux2

Donc... y'a autre chose...

Laurent Pointal
Le #600473
Laurent Pointal wrote:

PIGUET Bruno wrote:

<zip>
Voici un bout de code (presque) minimal qui reproduit le
comportement :
</zip>


ChezMoiCaMarche (TM) avec ton exemple de source (et un print d à la fin
pour afficher le dico).


Et même avec Python 2.5 build perso.

[ nobackup]$ py25 testpospen.py
a1=b
a2=c
#comment
{'a1': 'b', 'a2': 'c'}


[ nobackup]$ py25
Python 2.5 (r25:exporté, Feb 5 2007, 23:18:27)
[GCC 4.1.1 20060724 (prerelease) (4.1.1-3mdk)] on linux2


Amaury Forgeot d'Arc
Le #600470
Bonjour,

Pour tester un petit programme qui analyse la sortie d'un programme
externe lancé avec os.popen(), j'ai eu l'idée de remplacer le programme
externe par un "/bin/echo" qui génère des chaînes spécifiques.
He bien, ça ne marche pas. Là où os.popen() récupère bien la sortie
du vrai programme, il ne récupère pas la sortie de "echo".
J'ai testé que ma commande echo était correcte en l'appelant via
os.system(). Dans ce cas, tout va bien. mais avec popen(), couic !
Avez-vous déjà rencontré ce genre de comportement ?

Voici un bout de code (presque) minimal qui reproduit le
comportement :

import os
d={}
cmd = "/bin/echo -e 'a1=b n a2=cn#comment'"
os.system(cmd) # Là, ça marche
for line in os.popen(cmd).readlines(): # ne semble rien voir passer ?
line
if line[0] == '#':
continue
x=line.split('=')
if len(x) == 2:
d[x[0].strip()] = x[1].strip()
d

Bruno.


Peut-être que echo est trop intelligent, détecte le type de sortie
(stdout) et fait des choses différentes.
Par exemple, en mode 'terminal', il faut faire un flush() toutes les
lignes, alors que ce n'est pas nécessaire quand on écrit dans un fichier.

Ce qui expliquerait les comportements différents obtenus par d'autres:
ça dépend de l'OS, du terminal, des options du shell utilisé, etc etc.

(Ceci dit, moi j'utilise Windows qui est trop bête pour se poser ce
genre de problèmes.)

--
Amaury

Michel Claveau
Le #600468
Bonsoir !

Windows qui est trop bête pour se poser ce genre de problèmes.)


Crois-tu ? Sous windows, avec subprocess, on ne peut pas gérer
simultanement stdin, stdout et stderr. Et, avec Popen, c'est juste un
peu mieux. En plus, l'utilisation des PIPE (|) et des redirections (<,
, << et >>) complique singulièrement ce genre de manip.







--
@-salutations

Michel Claveau

Publicité
Poster une réponse
Anonyme