Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用http.server执行服务器端python脚本?_Python_Python 3.x - Fatal编程技术网

如何使用http.server执行服务器端python脚本?

如何使用http.server执行服务器端python脚本?,python,python-3.x,Python,Python 3.x,我有一个python脚本的集合,我希望能够通过按下按钮从web浏览器执行这些脚本 目前,我运行python-mhttp.server8000在端口8000上启动服务器。它可以很好地提供html页面,但仅此而已。是否可以让它执行python脚本(通过ajax)并返回输出,而不仅仅是返回.py文件的全文 此外,如果没有,是否有一种简单的方法(如仅在1或2个文件中)来实现这一点?我正在寻找PHP-s的等价物,但是python 为了完整起见,这是我的html <h1>Hello World&

我有一个python脚本的集合,我希望能够通过按下按钮从web浏览器执行这些脚本

目前,我运行
python-mhttp.server8000
在端口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>
你好,世界
点击我!
$(“按钮”)。单击(函数(){
$.get('/gui/run_bash.py');
});

http.server
只提供静态文件,当您点击python文件时,它不会执行任何服务器端处理或执行任何代码。如果您想运行一些python代码,您必须编写一个应用程序来实现这一点。Flask是一个Python web框架,可能非常适合此任务

您的flask应用程序在执行脚本时可能看起来像这样

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)
导入子流程
从烧瓶进口烧瓶
app=烧瓶(名称)
SCRIPTS\u ROOT='/path/to/script\u dir'
@app.route(“/run/”)
def运行脚本(脚本名称):
fp=os.path.join(脚本\根,脚本\名称)
尝试:
输出=子进程。检查输出(['python',fp])
除了subprocess.CalledProcessError作为调用外:
输出=call.output#如果退出代码为非零
返回输出.encode('utf-8')#或您的系统编码
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
应用程序运行(主机=127.0.0.1',端口=8000)
当然,我应该包括一个强制性警告“让Web服务器执行这样的命令是不安全的”,等等。有关更多详细信息,请查看。

--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蟒蛇3
打印(“内容类型:应用程序/json”)
打印()
打印(“{”你好“:“世界”}”)
radams@wombat:/tmp/z/h$python-m http.server--cgi
在0.0.0.0端口8000上提供HTTP服务(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-

参考资料:

http.server
就是这样——一种为静态文件提供服务的方式。它不进行任何服务器端处理。您可能想看看像Flask这样的框架,它可以让您以最小的工作量创建这样的应用程序。