(Courriels de diversion: <recensons@mammifere-stigmatise.com> <tisserent@pieter-subreptice.com> <conjecturait@attenuerez-beneficiez.com> <enerve@heriterions-vanter.com> <souillures@empresserai-recueillirent.com> <inspecterent@negocies-lunaire.com> <decuver@fastueux-militaient.com> <resisteras@faconnier-exponentielles.com> <antagoniste@implorerent-consisteriez.com> <admissibilites@commotionne-appuyait.com> )
Jean-Michel a écrit :
> Jean-Marc Mongrelet a écrit :
>
>
>> Jean-Michel a écrit :
>>
>>
>>> Il me semble que l'exemple suivant (que j'avais écrit en 2008)
>>> correspond au besoin:
>>>
>>>
>> Merci pour la réponse Jean-Michel... Elle me servira certainement
>> d'exemple pour l'utilisation de subprocess.Popen, car cela me manque.
>>
>> Mon problème me semble d'une autre nature...
>> J'ai déclaré un serveur http:
>> def main():
>> """main is the starting-point for our script."""
>> srv = BaseHTTPServer.HTTPServer(('',PORT),RequestHandler)
>> srv.serve_forever()
>> en me servant des ressources trouvé sur le web.
>> Dans la fonction do_GET, j'exécute un programme externe avec normalement
>> la commande os.popen(cmd) qui est censé être non bloquante. Mais, dans
>> cette fonction (do_Get), elle est bloquante. J'ai testé avec
>> os.popen(cmd &)... dans ce cas la commande rend la main, mais bloque le
>> serveur http (la fonction évènement do_GET n'est pas relancé tan que
>> l'application externe n'est pas terminé).
>>
>> Vu les symptômes, je vais déclarer un Thread parallèle, qui servira de
>> relai pour exécuter mais application externe.
>>
>> Voila,
>>
>> JM
>>
>>
>
> J'ai reproduit le problème dont vous parlez dans l'exemple ci-après.
> Je lance deux process.
> Le premier n'est pas bloqué. Le second l'est.
>
>
>
> import BaseHTTPServer
> import cgi, random, sys
> import os
>
>
> MESSAGES = [
> "That's as maybe, it's still a frog.",
> "Albatross! Albatross! Albatross!",
> "It's Wolfgang Amadeus Mozart",
> "A pink form from Reading.",
> "Hello people, and welcome to 'It's a Tree'"
> "I simply stare at the brick and it goes to sleep.",
> ]
>
> class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
>
> def do_GET(self):
> if self.path != "/":
> self.send_error(404, "File not found")
> return
> self.send_response(200)
> self.send_header("Content-type", "text/html")
> self.end_headers()
> try:
> cmd = "xterm"
> print "popen w"
> x = os.popen(cmd, 'w', 0)
> print " n'est pas bloquant"
>
> print "popen r est bloquant"
> x = os.popen(cmd, 'r', 0)
> print "Le second process est enfin termine"
> # redirect stdout to client
> stdout = sys.stdout
> sys.stdout = self.wfile
> self.makepage()
> finally:
> sys.stdout = stdout # restore
>
> def makepage(self):
> # generate a random message
> tagline = random.choice(MESSAGES)
> print "<html>"
> print "<body>"
> print "<p>Today's quote: "
> print "<i>%s</i>" % cgi.escape(tagline)
> print "</body>"
> print "</html>"
>
> PORT = 8000
>
> def main():
> """main is the starting-point for our script."""
> httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)
> print "serving at port", PORT
> httpd.serve_forever()
>
>
> main()
>
>
Dans l'exemple ci-dessus, la solution semble consister à ne pas détruire
l'objet retourné par popen.
Pour ce faire on peut ne pas affecter le résultat du deuxième popen à x,
mais à y, comme illustré ci-après:
print "popen w"
x = os.popen(cmd, 'w', 0)
print " n'est pas bloquant"
print "popen r est bloquant"
y = os.popen(cmd, 'r', 0)
print "Le second process est enfin termine"
Je n'ai rien trouvé de plus!
-----------------------------------------------------------------
Les listes de diffusion du CULTe - Pour une informatique libre
http://www.CULTe.org/listes/
Pour se desabonner:
mailto:linux-31-unsubscribe@CULTe.org?subject=Cliquez_sur_ENVOYER