根据请求调用Python脚本-Python服务器

根据请求调用Python脚本-Python服务器,python,server,python-requests,Python,Server,Python Requests,我希望能够通过在我从中创建的python服务器上发出请求来调用python脚本 我希望当服务器收到一个特定的请求时,它会启动Python脚本 我尝试了这个简单的代码,但没有成功。我认为在GET请求时,它将启动externalFunc.py脚本。但事实并非如此 #!/usr/bin/env python from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os #Create custom HTTPReque

我希望能够通过在我从中创建的python服务器上发出请求来调用python脚本

我希望当服务器收到一个特定的请求时,它会启动Python脚本

我尝试了这个简单的代码,但没有成功。我认为在
GET
请求时,它将启动
externalFunc.py
脚本。但事实并非如此

#!/usr/bin/env python

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import os

#Create custom HTTPRequestHandler class
class KodeFunHTTPRequestHandler(BaseHTTPRequestHandler):

#handle GET command
def do_GET(self):
    execfile("root\externalFunc.py")



def run():
   print('http server is starting...')

#ip and port of servr
#by default http server port is 80
server_address = ('127.0.0.1', 80)
httpd = HTTPServer(server_address, KodeFunHTTPRequestHandler)
print('http server is running...')
httpd.serve_forever()

if __name__ == '__main__':
run()
我没有任何错误,只是什么也没发生。 我做错了什么

编辑:以下是客户端发出的GET请求:

import sys

#get http server ip
http_server = '127.0.0.1'
#create a connection
conn = httplib.HTTPConnection(http_server)

#request command to server
conn.request('GET', '','')

#get response from server
rsp = conn.getresponse()

#print server response and data
print(rsp.status, rsp.reason)
data_received = rsp.read()
print(data_received)

conn.close()
我从服务器上得到一个501错误:

127.0.0.1 - - [20/Jan/2018 15:46:46] code 501, message Unsupported method ('GET')
127.0.0.1 - - [20/Jan/2018 15:46:46] "GET / HTTP/1.1" 501 -

首先,如果您复制并粘贴了python代码,那么您发布的python代码将被破坏 从您自己的脚本中,那么您的代码是无效的python,因为缩进 这是错误的

其次,只使用
exec
执行脚本是个坏主意,这可能很危险, 特别是如果你不是脚本的所有者,你怎么知道脚本是什么 是的

因此,让我们首先修改
root/externalFunc.py
:添加一个
run
方法 做剧本的工作。而不仅仅是打印到标准输出,
run
函数应该返回一些内容,例如字符串或 包含结果的字典

因为您没有向我们显示
root/externalFunc.py
的代码,所以我假设 脚本可能如下所示:

#!/usr/bin/env python
# root/externalFunc.py
# old version

def run():
    # ... doing some work,
    # result is a variable with the result
    print "Result: %d" % result

if __name__ == '__main__':
    main()
现在让我们修改它

  • root/
    目录中创建一个空文件
    \uuuu init\uuuuuuuu.py

    // on linux/mac/bsd
    $ touch root/__init__.py
    
    // on windows
    cmd> type NUL > root/__init__.py
    
  • 这允许使用根目录中的
    。在另一个模块中导出内容

  • 让我们添加一个实际执行工作的
    run
    方法:
  • 新版本:

    #!/usr/bin/env python
    # root/externalFunc.py
    # new version
    
    import sys
    
    def run(parm1, param2, param3):
        # ... doing some work,
        # result is a variable with the result
    
        return = {
            "success": True,
            "value": result
        }
    
    def main():
        if len(sys.argv) != 4:
            print >> sys.stderr, "usage: %s param1 param2 param3" % sys.argv
            return 1
        param1 = int(sys.argv[1])
        param2 = sys.argv[2]
        param3 = int(sys.argv[3])
    
        res = run(param1, param2, param3)
        if res["success"]:
            print "Result: %d" % res["value"]
            return 0
        else:
            print "Error, ..."
            return 1
    
    if __name__ == '__main__':
        return main()
    
    现在我们必须更改服务器代码以导入
    run
    方法并使用该方法 方法而不是使用
    exec
    execfile

    from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
    from root.externalFunc import run as externalFunc_run
    
    class KodeFunHTTPRequestHandler(BaseHTTPRequestHandler):
        def do_GET(self):
            param1 = 3
            param2 = "max"
            param3 = -12
    
            res = externalFunc_run(param1, param2, param3)
    
            if res["success"]:
                answer = "The result is: %d" % res["value"]
            else:
                answer = "Error while computing externalFunc"
    
            #send code 200 response
            self.send_response(200)
    
            #send header first
            self.send_header('Content-type','text/plain')
            self.end_headers()
    
            # send answer
            self.wfile.write(answer)
    
    现在,如果您不想(或不能)更改
    root/externalFunc.py
    的代码或脚本 不是python脚本,那么您可以使用

    在调用的幕后,使用
    子流程。检查输出
    更安全 ,它在新进程中执行子程序, 因此,子程序在运行时不会造成损坏

    现在可以替换此行
    res=externalFunc\u run(param1、param2、param3)

    使用
    子流程。检查\u输出
    行。

    没有看到
    root\externalFunc.py
    现在有办法知道。
    do\u GET
    处理程序必须发送对请求的响应。我不认为
    root\externalFunc.py
    能为您做到这一点。你为什么要使用
    execfile
    呢?你是对的,也许我没有使用好的函数。我想做的很简单:我想根据任何请求启动Python脚本,不管它是GET/POST/什么..您在web浏览器
    http://127.0.0.1:80
    ?非常感谢您的帮助和时间,我非常感谢。好吧,我现在明白了。我仍然有一个问题:当我试图从客户端脚本发送
    Get
    请求时,我收到一个错误
    Unsupported method('Get')错误501
    。为什么?@thib我不知道,我不使用
    BaseHTTPRequestHandler
    ,我通常使用tornado。稍后我会仔细看看。错误消息可能是一个例外,您在代码的哪一部分得到了它?非常感谢。我在发布GET请求时得到了它:
    http#u server='127.0.0.1'#创建连接conn=httplib.HTTPConnection(http#server)#请求命令到服务器conn.request('GET','')#从服务器rsp=conn.getresponse()
    @thib这是在服务器脚本上还是在客户端脚本上?这是客户端发出的请求,在服务器上,我没有更改您编写的do_GET方法。
    import subprocess
    import shlex
    
    # bad, don't do that
    # exec("root/externalFunc.py")
    
    # do this instead
    answer = subprocess.check_output(shlex.split("root/externalFunc.py params..."))
    print "Answer: %s" % answer