Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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

4 réponses
Avatar
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 \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

Bruno.

4 réponses

Avatar
Laurent Pointal
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...

Avatar
Laurent Pointal
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


Avatar
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

Avatar
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