(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