我有一组python脚本,我希望能够通过网页浏览器按下按钮执行。
目前,我运行python -m http.server 8000
以在端口8000上启动服务器。它可以很好地提供html页面,但这就是它的全部功能。是否可以让它执行python脚本(通过ajax)并返回输出,而不是只返回.py文件的全文。
此外,如果没有,是否有一个简单的(如只有1或2个文件)方式使这项工作?我正在寻找相当于PHP -s,但是对于python。
为了完整性,这是我的HTML
<h1>Hello World</h1>
<button>
Click me!
</button>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.js"> </script>
<script>
$('button').click(function(){
$.get('/gui/run_bash.py');
});
</script>
答案 0 :(得分:1)
http.server
仅提供静态文件,当您点击python文件时,它不会执行任何服务器端处理或执行任何代码。如果你想运行一些python代码,你必须编写一个应用程序来做到这一点。 Flask是一个Python Web框架,可能非常适合这项任务。
您的烧瓶应用程序可能看起来像执行脚本......
import subprocess
from flask import Flask
app = Flask(__name__)
SCRIPTS_ROOT = '/path/to/script_dir'
@app.route('/run/<script_name>')
def run_script(script_name):
fp = os.path.join(SCRIPTS_ROOT, script_name)
try:
output = subprocess.check_output(['python', fp])
except subprocess.CalledProcessError as call:
output = call.output # if exit code was non-zero
return output.encode('utf-8') # or your system encoding
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8000)
当然,我应该包括强制性警告'让网络服务器执行这样的命令是不安全的'等等。查看Flask quickstart了解更多详情。
答案 1 :(得分:1)
将--cgi
添加到命令行。
python -m http.server --cgi 8000
然后将您的python脚本放在./cgi-bin中并将它们标记为可执行文件。
$ mkdir cgi-bin
$ cp hello.py cgi-bin/hello.py
$ chmod +x cgi-bin/hello.py
您可能需要稍微修改您的python脚本以支持CGI协议。
这是运行的服务器:
$ cat cgi-bin/hello.py
#! /usr/bin/env python3
print("Content-Type: application/json")
print()
print('{"hello": "world"}')
radams@wombat:/tmp/z/h$ python -m http.server --cgi
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
127.0.0.1 - - [20/Mar/2018 18:04:16] "GET /cgi-bin/hello.py HTTP/1.1" 200 -
参考:https://docs.python.org/3/library/http.server.html#http.server.CGIHTTPRequestHandler