Terima kasih sebelumnya atas bantuan apa pun. Saya cukup baru mengenal python dan bahkan lebih baru mengenal html.
Saya telah mencoba beberapa hari terakhir untuk membuat halaman web dengan tombol untuk melakukan tugas di server rumah.
Saat ini saya memiliki skrip python yang menghasilkan halaman dengan tombol:
(See the simplified example below. removed code to clean up post)
Kemudian skrip python yang menjalankan perintah tersebut dan menghasilkan iframe
di halaman:
(See the simplified example below. removed code to clean up post)
Ini menampilkan seluruh keluaran yang telah selesai setelah perintah selesai. Saya juga telah mencoba menambahkan opsi -u
ke skrip python untuk menjalankannya tanpa buffer. Saya juga sudah mencoba menggunakan Python subprocess
juga. Jika itu membantu, jenis perintah yang saya jalankan adalah apt-get update
, dan skrip Python lainnya untuk memindahkan file dan memperbaiki izin folder.
Dan ketika dijalankan dari terminal server Ubuntu normal, ia berjalan dengan baik dan menghasilkan keluaran secara real time dan dari penelitian saya, ia seharusnya menghasilkan keluaran saat perintah dijalankan.
Adakah yang bisa memberi tahu saya di mana kesalahan saya? Haruskah saya menggunakan bahasa lain untuk menjalankan fungsi ini?
EDIT Contoh yang disederhanakan:
halaman awal:
#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>
skrip yang membuat tombol:
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
skrip yang harus menjalankan perintah:
# 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()
Saya belum menguji contoh sederhana di atas jadi tidak yakin apakah ini berfungsi.
Sunting:
Contoh sederhana seharusnya bisa digunakan sekarang.
Sunting:
Kode Imrans di bawah ini jika saya membuka browser ke ip:8000 itu akan menampilkan output seperti sedang berjalan di terminal yang persis seperti yang saya inginkan. Kecuali saya menggunakan server Apache untuk situs web saya dan iframe untuk menampilkan hasilnya. Bagaimana cara melakukannya dengan Apache?
sunting:
Saya sekarang memiliki output yang masuk ke iframe menggunakan contoh Imrans di bawah ini tetapi sepertinya masih buffer misalnya:
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.
Apakah memang seperti itu cara kerjanya?
EDIT 19-03-2014:
setiap perintah bash/shell yang saya jalankan menggunakan cara Imrans tampaknya ditampilkan ke iframe hampir secara realtime. Tetapi jika saya menjalankan skrip python apa pun melaluinya, outputnya di-buffer kemudian dikirim ke iframe.
Apakah saya mungkin perlu PIPE output dari skrip python yang dijalankan oleh skrip yang menjalankan server web?
javascript
di browser dan subproses di server. Untuk menjawab pertanyaan Anda: stdout dari subproses dikirim ke browser. - person jfs   schedule 15.03.2014-u
flag, jadi tidak ada buffer; setiap byte segera dikirim) - person jfs   schedule 15.03.2014curl http://youhost.com/path/to/script.py
? - person jfs   schedule 17.03.2014HTTP/1.1
dan bukanHTTP/1.0
- person jfs   schedule 17.03.2014HTTP/1.1 200 OK
(baris pertama dalam respons dari server) - person jfs   schedule 17.03.2014curl -v http://youhost.com/path/to/script.py |& grep 'HTTP/'
Apa yang Anda lihat HTTP/1.0 atau HTTP/1.1 200 OK? - person jfs   schedule 26.04.2014python -u
? Berikut adalah beberapa solusi untuk masalah buffering blok untuk stdout subproses. - person jfs   schedule 27.04.2014