(Courriels de diversion: <mammifere@stigmatise-tisserent.com> <pieter@subreptice-conjecturait.com> <attenuerez@beneficiez-enerve.com> <heriterions@vanter-souillures.com> <empresserai@recueillirent-inspecterent.com> <negocies@lunaire-decuver.com> <fastueux@militaient-resisteras.com> <faconnier@exponentielles-antagoniste.com> <implorerent@consisteriez-admissibilites.com> <commotionne@appuyait-cuisinerez.com> )
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() ----------------------------------------------------------------- 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