(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