2009-06-11 7 views
0

J'ai maintenant un petit serveur java script fonctionne correctement, appelé par:Envoyer la sortie d'un serveur python retour au client

<?php 
    $handle = fsockopen("udp://78.129.148.16",12345); 
    fwrite($handle,"vzctlrestart110"); 
    fclose($handle); 
?> 

Sur un serveur distant le serveur python suivant est en cours d'exécution et l'exécution

de la COMAND
#!/usr/bin/python 
import os 
import socket 
print " Loading Bindings..." 
settings = {} 
line = 0 
for each in open('/root/actions.txt', 'r'): 
line = line + 1 
each = each.rstrip() 
if each != "": 
    if each[0] != '#': 
    a = each.partition(':') 
    if a[2]: 
     settings[a[0]] = a[2] 
    else: 
     print " Err @ line",line,":",each 
print " Starting Server...", 
port = 12345 
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
s.bind(("", port)) 
print "OK." 
print " Listening on port:", port 
while True: 
    datagram = s.recv(1024) 
    if not datagram: 
     break 
    print "Rx Cmd:", datagram 
    if settings.has_key(datagram): 
     print "Launch:", settings[datagram] 
     os.system(settings[datagram]+" &") 
s.close() 

Est-il possible d'envoyer facilement la sortie de la commande, lorsque le serveur est démarré et exécute une commande, la sortie est affichée dans la fenêtre ssh, mais je veux que cette sortie soit renvoyée au navigateur de la client d'origine, peut-être le réglage du navigateur pour attendre 15 secondes s puis vérifiez les données reçues via la socket.

Je sais que je demande beaucoup, mais je suis en train de créer un script PHP dont j'ai une grande connaissance, mais mes connaissances en python manquent énormément.

Merci, Ashley

+0

Merci SilentGhost pour le reformater. – Skurmedel

Répondre

1

Oui, vous pouvez lire la sortie de la commande. Pour cela, je recommande le module Python subprocess. Ensuite, vous pouvez simplement revenir à s.write().

Naturellement, cela a des implications, vous devrez probablement laisser votre script PHP s'exécuter pendant un certain temps car le processus peut être lent.

# The pipe behaves like a file object in Python. 
process = Popen(cmd, shell=True, stdout=PIPE) 
process_output = "" 
while process.poll(): 
    process_output += process.stdout.read(256) 
s.write(process_output) 

# Better yet. 
process = Popen(cmd, shell=true, stdout=PIPE) 
stdout, stderr = process.communicate() # will read and wait for process to end. 
s.write(stdout) 

intégré dans votre code:

# ... snip ... 
import subprocess 
con, addr = s.accept() 
while True: 
    datagram = con.recv(1024) 
    if not datagram: 
     break 
    print "Rx Cmd:", datagram 
    if settings.has_key(datagram): 
     print "Launch:", settings[datagram] 
     process = subprocess.Popen(settings[datagram]+" &", shell=True, stdout=subprocess.PIPE) 
     stdout, stderr = process.communicate() 
     con.send(stdout) 
    con.close() 
s.close() 
+0

toutes mes commandes prennent environ 15 à 20 secondes, comme je l'ai dit im très nouveau à python, tout changement d'un script de base que je peux avoir l'idée de comment cela fonctionne et l'implémenter? – AshleyUK

+0

Eh bien, malheureusement, cela dépend de la commande que vous utilisez avec votre script Python, je pense. Si vous pouviez le faire de manière asynchrone à partir de votre page, cela ne ferait pas tourner le navigateur, mais cela rendrait évidemment les choses beaucoup plus complexes. – Skurmedel

+0

Je cours les commandes vzctl d'openvz telles que vzctl restart 110 e.t.c, je ne me dérange pas le brower tournant, car je veux que l'utilisateur puisse voir que la commande est en cours d'exécution. Je ne sais pas exactement comment je pourrais intégrer votre code ci-dessus dans le script que j'utilise déjà, par exemple exactement où le placer. – AshleyUK

0

Voici un exemple de la façon d'obtenir la sortie d'une commande:

>>> import commands 
>>> s = commands.getoutput("ls *") 
>>> s 
'client.py' 
Questions connexes