(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