温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Tornado和subprocess实现和外部程序通信

发布时间:2020-05-28 03:15:15 来源:网络 阅读:354 作者:nineteens 栏目:编程语言

  主要涉及subprocess的使用,简单点,直接上代码吧,只是做一下记录。

  import tornado.ioloop, os, random

  import urllib, time

  import tornado.web

  import tornado.httpserver

  import tornado.options

  import subprocess

  from tornado.options import options, define

  from tornado.web import url, RequestHandler, MissingArgumentError

  from tornado.escape import json_encode

  ##

  # 功能:文件上传、代码提交、执行代码、停止代码

  #

  # 路由:ip:8000/

  # 演示功能:打开上传文件或者上传文件的浏览器界面,点及上传或者提交代码

  # 路由:ip:8000/upload

  # post上传文件的接口,将所选的文件中的内容转储到服务器中的/tmp/new_code.py文件中

  # 路由:ip:8000/send

  # post提交代码的接口,代码作为字符串形式提交

  # 路由:ip:8000/run/start

  # 启动服务器中文件名为new_code.py的代码文件,新建线程执行

  # 路由:ip:8000/run/stop

  # 停止服务器中文件名为new_code.py所开启的线程

  ##

  # 设置服务的端口

  define("port", default=8000, type=int, help="run server on the given port.")

  # 静态资源配置

  settings = {

  "static_path": os.path.join(os.path.dirname(__file__), "static"),

  "template_path": os.path.join(os.path.dirname(__file__), "views"),

  }

  ##

  # 设置允许跨域请求的base类

  class BaseHandler(tornado.web.RequestHandler):

  def set_default_headers(self):

  self.set_header("Access-Control-Allow-Origin", "*");

  self.set_header("Access-Control-Allow-Headers", "*");

  self.set_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); #请求允许的方法

  self.set_header("Access-Control-Max-Age", "3600");

  #处理OPTIONS请求

  def options(self):

  #返回方法1

  #self.set_status(204)

  #self.finish()

  #返回方法2

  self.write('{"errorCode":"00","errorMessage","success"}')

  ##

  # localhost:8000/ 打开浏览器输入,

  class MainHandler(BaseHandler):

  def get(self):

  self.write('

  self.write('') #

  #

  # 文件上传的类,使用post发送

  class UploadHandler(BaseHandler):

  def get(self):

  # a3_url = self.reverse_url("a3_url")

  # self.write('this is a3' % a3_url)

  self.write("get code:

  ")

  def post(self):

  files = self.request.files["fff"]

  if files:

  pyf = files[0]["body"]

  # pyfname = files[0]["filename"]

  # self.write(pyfname)

  with open("/tmp/new_code.py", 'wb+') as up:

  up.write(pyf)

  self.write("OK")

  else:

  self.write("Error!")

  # 发送代码字符串的类(带隐式格式)

  class SendHandler(BaseHandler):

  # 用URL的get的方式发送

  def get(self):

  code = self.get_argument("code")

  if code:

  with open("/tmp/new_code.py", 'w+') as up:

  up.write(code)

  else:

  self.write("参数为空!")

  # 用form表单或者ajax等的post加密方式发送

  def post(self):

  # URL编码

  code = urllib.parse.quote(self.request.arguments["code"][0].decode("UTF-8"))

  if code:

  # name = str(random.randint(0,1000))+".py"

  with open("/tmp/new_code.py", 'w+') as up:

  # URL解码

  up.write(urllib.parse.unquote(code))

  # 回显到控制台

  with open("/tmp/new_code.py", 'r') as r:

  rs = r.readlines();

  for x in rs:

  print(x, end="")

  else:

  self.write("参数为空!")

  # 存放线程对象

  class G:

  p = None

  ##

  # 执行代码文件的类

  class SsHandler(BaseHandler):

  def get(self, cmd):

  '''

  cmd: 接收前端的正则表达式字符串

  '''

  print("Command:%s" % cmd)

  if cmd == 'start':无锡妇科医院排行 http://www.0510bhyy.com/

  # 将文件名修改

  G.p = subprocess.Popen(["python","/tmp/new_code.py"], shell=False, stdout=subprocess.PIPE, stderr = subprocess.PIPE)

  # this is a test server used to see whether it is running or not

  # print("tornado l_server running at http://localhost:8001/a1")

  print(type(G.p))

  print(G.p)

  # 会阻塞

  # returncode = G.p.wait()

  # print(returncode)

  elif cmd == 'stop':

  if G.p is not None:

  poll = G.p.poll() #获取子进程的状态

  if poll==0:

  # print(G.p.stdout.read())

  # print(G.p.stderr.read())

  print("程序执行完毕!不需要手动结束!")

  elif poll is None:

  print("程序正在执行!马上退出...")

  # 获取子进程的pid

  pid = G.p.pid

  print("pid: {}".format(pid))

  # 杀死进程

  G.p.kill()

  print("killed.")

  else:

  print("状态码:{}".format(poll))

  print("程序异常退出!")

  else:

  print("p is nothing")

  else:

  print("Command is not right!")

  print("Done!")

  # 没用

  def post(self):

  self.write("post-StartHandler")

  # 定义路由设置

  def make_app():

  return tornado.web.Application([

  (r"/", MainHandler),

  # (r"/get", ItcastHandler, {"subject":"sub"}),

  (r"/upload", UploadHandler),

  (r"/send", SendHandler),

  (r"/run/(\w*)", SsHandler),

  (r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler,

  dict(path=settings['static_path'])),

  ], **settings)

  ##

  # main函数入口

  if __name__ == "__main__":

  tornado.options.parse_command_line()

  app = make_app()

  app.listen(options.port)

  print("tornado server running at http://localhost:8000")

  tornado.ioloop.IOLoop.current().start()


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI