Отправить вывод с сервера Python обратно клиенту - PullRequest
0 голосов
/ 11 июня 2009

Теперь у меня есть небольшой сервер Java-скриптов, работающий корректно, который называется:

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

На удаленном сервере следующий сервер python работает и выполняет команду

#!/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()

Можно ли легко отправить вывод команды обратно, когда сервер запущен и выполняет команду, вывод отображается в окне ssh, однако я хочу, чтобы этот вывод был отправлен обратно в браузер оригинала клиент, возможно, настроить браузер на ожидание в течение 15 секунд, а затем проверить наличие данных, полученных через сокет.

Я знаю, что спрашиваю довольно много, однако я создаю сценарий PHP, о котором у меня есть большие знания, однако мои знания по питону сильно отсутствуют.

Спасибо, Ashley

Ответы [ 2 ]

1 голос
/ 11 июня 2009

Да, вы можете прочитать вывод команды. Для этого я бы рекомендовал модуль Python subprocess . Тогда вы можете просто s.write() вернуть обратно.

Естественно, это имеет некоторые последствия, вам, вероятно, придется позволить вашему PHP-скрипту работать еще какое-то время, поскольку процесс может выполняться медленно.

# 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)

Интегрировано в ваш код:

# ... 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 голосов
/ 11 июня 2009

Вот пример того, как получить вывод команды:

>>> import commands
>>> s =  commands.getoutput("ls *")
>>> s
'client.py'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...