根据请求调用Python脚本-Python服务器
我希望能够通过在我从中创建的python服务器上发出请求来调用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
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