Заранее благодарю за любую помощь. Я новичок в python и даже в html.
Последние несколько дней я пытался создать веб-страницу с кнопками для выполнения задач на домашнем сервере.
На данный момент у меня есть скрипт python, который генерирует страницу с кнопками:
(See the simplified example below. removed code to clean up post)
Затем скрипт Python, который запускает указанную команду и выводит iframe
на странице:
(See the simplified example below. removed code to clean up post)
Это выводит весь готовый вывод после завершения команды. Я также попытался добавить параметр -u
в скрипт Python, чтобы запустить его без буферизации. Я также пытался использовать Python subprocess
. Если это поможет, типы команд, которые я запускаю, — это apt-get update
и другие сценарии Python для перемещения файлов и исправления прав доступа к папкам.
И при запуске с обычного серверного терминала Ubuntu он работает нормально и выводит в реальном времени, и, согласно моим исследованиям, он должен выводиться при запуске команды.
Может ли кто-нибудь сказать мне, где я ошибаюсь? Должен ли я использовать другой язык для выполнения этой функции?
РЕДАКТИРОВАТЬ Упрощенный пример:
начальная страница:
#runcmd.html
<head>
<title>Admin Tasks</title>
</head>
<center>
<iframe src="/scripts/python/test/createbutton.py" width="650" height="800" frameborder="0" ALLOWTRANSPARENCY="true"></iframe>
<iframe width="650" height="800" frameborder="0" ALLOWTRANSPARENCY="true" name="display"></iframe>
</center>
скрипт, который создает кнопку:
cmd_page = '<form action="/scripts/python/test/runcmd.py" method="post" target="display" >' + '<label for="run_update">run updates</label><br>' + '<input align="Left" type="submit" value="runupdate" name="update" title="run_update">' + "</form><br>" + "\n"
print ("Content-type: text/html")
print ''
print cmd_page
скрипт, который должен запускать команду:
# runcmd.py:
import os
import pexpect
import cgi
import cgitb
import sys
cgitb.enable()
fs = cgi.FieldStorage()
sc_command = fs.getvalue("update")
if sc_command == "runupdate":
cmd = "/usr/bin/sudo apt-get update"
pd = pexpect.spawn(cmd, timeout=None, logfile=sys.stdout)
print ("Content-type: text/html")
print ''
print "<pre>"
line = pd.readline()
while line:
line = pd.readline()
Я не тестировал приведенный выше упрощенный пример, поэтому не уверен, что он функционален.
РЕДАКТИРОВАТЬ:
Упрощенный пример должен работать сейчас.
Редактировать:
Код Imrans ниже, если я открою браузер для ip: 8000, он отобразит вывод так же, как он работал в терминале, что именно то, что я хочу. За исключением того, что я использую сервер Apache для своего веб-сайта и iframe для отображения вывода. Как мне это сделать с Apache?
редактировать:
Теперь у меня есть вывод, поступающий в iframe, с использованием приведенного ниже примера Imrans, но он все еще, например, буферизуется:
If I have it (the script through the web server using curl ip:8000) run apt-get update in terminal it runs fine but when outputting to the web page it seems to buffer a couple of lines => output => buffer => ouput till the command is done.
But running other python scripts the same way buffer then output everything at once even with the -u flag. While again in terminal running curl ip:800 outputs like normal.
Это просто так должно работать?
РЕДАКТИРОВАТЬ 19-03-2014:
любая команда bash/shell, которую я запускаю с помощью Imrans, кажется, выводится в iframe почти в реальном времени. Но если я запускаю через него какой-либо скрипт Python, вывод буферизуется, а затем отправляется в iframe.
Возможно, мне нужно передать вывод сценария Python, который запускается сценарием, запускающим веб-сервер?
javascript
в браузере и подпроцессом на сервере. Чтобы ответить на ваш вопрос: стандартный вывод из подпроцесса отправляется в браузер. - person jfs   schedule 15.03.2014-u
флаг, поэтому буфера нет, каждый байт отправляется сразу) - person jfs   schedule 15.03.2014curl http://youhost.com/path/to/script.py
? - person jfs   schedule 17.03.2014HTTP/1.1
, а неHTTP/1.0
- person jfs   schedule 17.03.2014HTTP/1.1 200 OK
(первая строка в ответе от сервера) - person jfs   schedule 17.03.2014curl -v http://youhost.com/path/to/script.py |& grep 'HTTP/'
Что вы видите HTTP/1.0 или HTTP/1.1 200 OK? - person jfs   schedule 26.04.2014python -u
? Вот несколько обходных путей для проблемы буферизации блоков для stdout подпроцесса. - person jfs   schedule 27.04.2014