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=c\n#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
[ 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
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
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.)
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
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
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.
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.