OVH Cloud OVH Cloud

sys.stdout.write

12 réponses
Avatar
R12y
Bonjour,

J'ai un script python, qui fait un

[...]
class Titre:
def __init__(self,p):
self.path=p
def prout(self):
fd=open(self.path,"rb")
sys.stdout.write(fd.read)
[...]

Plus bas je fais ceci:

l=[ # une liste d'instance de Titre # ]
for t in l:
t.prout()


Le fichier est une vidéo theora qu'on doit balancer au stdin d'un
programme (ezsteam [1])

J'ai un souci avec ce truc:
Si je fais un sys.stdout.flush() ou un fd.close() apres le
sys.stdout.write(fd.read) alors le stream est merdique: le sont est
haché, l'enchainement des titres est mal fait et des fois il perd le
tunnel (broken pipe) .
Pourtant, si je ne fd.close() pas, l'enchainement des fichiers à streamer
est correct.
J'ai un petit millier de fichier à streamer en fonction de l'heure et
tout, et je crois bien que si je ne fd.close() pas, je risque quelquechose.
De plus, si le serveur est surchargé au niveau CPU, par un autre thread
python qui n'a rien à voir (l'usine à gaz du site Zope/CPS), alors il
casse la pipe (broken pipe)... je ne comprend pas pourquoi, il n'y a aucun
calcul à faire, juste faire un prout()...

Voici [2] le code du script, syntaxiquement coloré (le preview ne marche
pas, faut le downloader) .

[1 C'est ezstream qui ensuite l'envoie à un serveur icecast]
[2
http://www.rktmb.org/workspaces/members/mihamina/telegasy-programmation/
]

Merci.

--

http://www.onirik.net/article.php3?id_article=817
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html

10 réponses

1 2
Avatar
Amaury Forgeot d'Arc
Bonjour,

J'ai un script python, qui fait un

[...]
class Titre:
def __init__(self,p):
self.path=p
def prout(self):
fd=open(self.path,"rb")
sys.stdout.write(fd.read)
[...]

Plus bas je fais ceci:

l=[ # une liste d'instance de Titre # ]
for t in l:
t.prout()


J'ai bien compris que 'prout' est tiré de l'anglais (print out), et n'a
aucune signification en français... ;-)


Le fichier est une vidéo theora qu'on doit balancer au stdin d'un
programme (ezsteam [1])

J'ai un souci avec ce truc:
Si je fais un sys.stdout.flush() ou un fd.close() apres le
sys.stdout.write(fd.read) alors le stream est merdique: le sont est
haché, l'enchainement des titres est mal fait et des fois il perd le
tunnel (broken pipe) .
Pourtant, si je ne fd.close() pas, l'enchainement des fichiers à streamer
est correct.
J'ai un petit millier de fichier à streamer en fonction de l'heure et
tout, et je crois bien que si je ne fd.close() pas, je risque quelquechose.


Mais en quittant la fonction, la variable locale fd sort du scope, et
l'objet fichier est automatiquement fermé, puis détruit!
(Euh, sauf avec jython, mais ça ne semble pas être ton cas)

Ajouter fd.close() ne devrait pas changer grand chose... sauf à écrire
du code plus lisible et explicite.
C'est à n'y rien comprendre...

De plus, si le serveur est surchargé au niveau CPU, par un autre thread
python qui n'a rien à voir (l'usine à gaz du site Zope/CPS), alors il
casse la pipe (broken pipe)... je ne comprend pas pourquoi, il n'y a aucun
calcul à faire, juste faire un prout()...

Voici [2] le code du script, syntaxiquement coloré (le preview ne marche
pas, faut le downloader) .

[1 C'est ezstream qui ensuite l'envoie à un serveur icecast]
[2
http://www.rktmb.org/workspaces/members/mihamina/telegasy-programmation/
]

Merci.



--
Amaury

Avatar
R12y
Amaury Forgeot d'Arc :

Mais en quittant la fonction, la variable locale fd sort du scope, et
l'objet fichier est automatiquement fermé, puis détruit!


Je me disais que ça pouvait se passer comme ça aussi...

(Euh, sauf avec jython, mais ça ne semble pas être ton cas)


Non, pas encore de Jython chez moi :-)

Ajouter fd.close() ne devrait pas changer grand chose... sauf à écrire
du code plus lisible et explicite.


Disons que comme je fréquente beaucoup de programeur en C, ils me
rabachent qu'il faut libérer le plus tot possible une ressource dont on ne
se sert plus, mon premier reflexe a été de fd.close() le plus rapidement
après de open(). Mais ça foirait le système...

C'est à n'y rien comprendre...


Mon code? Pas clair? je suis ouvert à des remarques plus verbeuses, si
possible. J'ai codé ce truc à la va vite en plusieurs séances de 30
minutes... (entre deux cours...)
Mais je vais le recoder, il y a une façon plus prepre de faire avec
http://downloads.us.xiph.org/releases/libshout/shout-python-0.2.tar.gz.
Le fichier example.py embarqué dans le tarball est... limpide.

--

http://www.onirik.net/article.php3?id_article7
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html

Avatar
Amaury Forgeot d'Arc

C'est à n'y rien comprendre...


Mon code? Pas clair?


Non non, c'est le problème que je ne vois pas. Il ne devrait pas y avoir
de différence de comportement entre fd.close() ou pas !

--
Amaury


Avatar
R12y
Amaury Forgeot d'Arc :

t.prout()
J'ai bien compris que 'prout' est tiré de l'anglais (print out), et n'a

aucune signification en français...


C'est pourtant la signification "en français" que je voulais donner à
cette fonction. :-)
De toutes façons, en fait, pour moi, anatomiquement, la sortie standard,
ben c'est celle à laquelle on pense...
J'ai tenté de mettre _un peu_ d'humour suggestif dans mon code.

--

http://www.onirik.net/article.php3?id_article7
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html


Avatar
Bertrand B

J'ai tenté de mettre _un peu_ d'humour suggestif dans mon code.



s/sug/di/

Avatar
jean-michel bain-cornu
Amaury Forgeot d'Arc wrote:

Bonjour,

J'ai un script python, qui fait un
[...]
class Titre:
def __init__(self,p):
self.path=p
def prout(self):
fd=open(self.path,"rb")
sys.stdout.write(fd.read)
[...]

Plus bas je fais ceci:

l=[ # une liste d'instance de Titre # ]
for t in l:
t.prout()

J'ai un souci avec ce truc:
Si je fais un sys.stdout.flush() ou un fd.close() apres le
sys.stdout.write(fd.read) alors le stream est merdique: le sont est
haché, l'enchainement des titres est mal fait et des fois il perd le
tunnel (broken pipe) .
Pourtant, si je ne fd.close() pas, l'enchainement des fichiers à streamer
est correct.
J'ai un petit millier de fichier à streamer en fonction de l'heure et
tout, et je crois bien que si je ne fd.close() pas, je risque
quelquechose.



Mais en quittant la fonction, la variable locale fd sort du scope, et
l'objet fichier est automatiquement fermé, puis détruit!
(Euh, sauf avec jython, mais ça ne semble pas être ton cas)

Ajouter fd.close() ne devrait pas changer grand chose... sauf à écrire
du code plus lisible et explicite.
C'est à n'y rien comprendre...

ça me rappelle quelque chose. Un parser que j'avais fait et qui devait

analyser plusieurs milliers de fichier. Pour que ça marche bien, je
devais faire un 'del' explicite de l'objet fichier après le close, sinon
il se passait des trucs louches dans le genre de ce que tu décris.
Dans ton cas, j'essaierais 'del fd' après 'fd.close'.
J'ajoute que c'est le seul problème inexpliqué que j'aie eu avec python.
A+
jm


Avatar
F. Petitjean
Bonjour,

J'ai un script python, qui fait un

[...]
class Titre:
def __init__(self,p):
self.path=p
def prout(self):
fd=open(self.path,"rb")
sys.stdout.write(fd.read)
Il ne manquerait pas des patrnthèses après le .read ?

fd = open(self.path, "rb")
contenu = fd.read()
fd.close()
sys.stdout.write(contenu)
[...]

Plus bas je fais ceci:

l=[ # une liste d'instance de Titre # ]
for t in l:
t.prout()


Le fichier est une vidéo theora qu'on doit balancer au stdin d'un
programme (ezsteam [1])
et si le fichier est une vidéo, il se peut qu'il soit volumineux et donc

un seul read() est une solution un poil expéditive (je ne sais pas de
combien de mémoire est équipé votre serveur ni quelles sont les tailles
des fichiers).

J'ai un souci avec ce truc:
Si je fais un sys.stdout.flush() ou un fd.close() apres le
sys.stdout.write(fd.read) alors le stream est merdique: le sont est
haché, l'enchainement des titres est mal fait et des fois il perd le
tunnel (broken pipe) .
En lisant et en envoyant seulement des morceaux de taille raisonnable

cela devrait mettre un peu d'huile dans les rouages. (tester avec et
sans sys.stdout.flush() après chaque sys.stdout.write(morceau) )
Pourtant, si je ne fd.close() pas, l'enchainement des fichiers à streamer
est correct.
J'ai un petit millier de fichier à streamer en fonction de l'heure et
tout, et je crois bien que si je ne fd.close() pas, je risque quelquechose.
De plus, si le serveur est surchargé au niveau CPU, par un autre thread
python qui n'a rien à voir (l'usine à gaz du site Zope/CPS), alors il
casse la pipe (broken pipe)... je ne comprend pas pourquoi, il n'y a aucun
calcul à faire, juste faire un prout()...

Voici [2] le code du script, syntaxiquement coloré (le preview ne marche
pas, faut le downloader) .

[1 C'est ezstream qui ensuite l'envoie à un serveur icecast]
[2
http://www.rktmb.org/workspaces/members/mihamina/telegasy-programmation/
]

Merci.



Avatar
R12y
F. Petitjean :

sys.stdout.write(fd.read)
Il ne manquerait pas des patrnthèses après le .read ?



Si.
Mais c'est parceque j'ai simplifié le bout de code, dans mon code il y a
bien des ().
Effectivement dans le "example.py" de shout-python, il envoie par tranche
de 4096.
Merci.
--

http://www.onirik.net/article.php3?id_article7
http://www.maemo.org/platform/docs/howtos/howto_new_application.html
http://www.linuxdevices.com/files/article057/index.html


Avatar
Amaury Forgeot d'Arc
ça me rappelle quelque chose. Un parser que j'avais fait et qui devait
analyser plusieurs milliers de fichier. Pour que ça marche bien, je
devais faire un 'del' explicite de l'objet fichier après le close, sinon
il se passait des trucs louches dans le genre de ce que tu décris.
Dans ton cas, j'essaierais 'del fd' après 'fd.close'.


...qui ne devrait rien changer non plus : en sortant de la fonction, les
variables locales sont toutes détruites !

Enfin, en théorie... devant ce genre de problèmes, il faut rester
humble, et accepter toute solution, même si elle ne semble pas logique.

J'ajoute que c'est le seul problème inexpliqué que j'aie eu avec python.


Si l'informatique était une science exacte, ça se saurait.

Avatar
jean-michel bain-cornu
Amaury Forgeot d'Arc wrote:

ça me rappelle quelque chose. Un parser que j'avais fait et qui devait
analyser plusieurs milliers de fichier. Pour que ça marche bien, je
devais faire un 'del' explicite de l'objet fichier après le close,
sinon il se passait des trucs louches dans le genre de ce que tu décris.
Dans ton cas, j'essaierais 'del fd' après 'fd.close'.



...qui ne devrait rien changer non plus : en sortant de la fonction, les
variables locales sont toutes détruites !
+=1


Enfin, en théorie... devant ce genre de problèmes, il faut rester
humble, et accepter toute solution, même si elle ne semble pas logique.

J'ajoute que c'est le seul problème inexpliqué que j'aie eu avec python.



Si l'informatique était une science exacte, ça se saurait.
+=1



1 2