(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