中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

永康市| 松江区| 华安县| 和田县| 怀集县| 盘锦市| 娱乐| 温宿县| 磴口县| 和林格尔县| 涿鹿县| 青铜峡市| 西乡县| 郸城县| 内丘县| 大埔县| 定兴县| 石门县| 都兰县| 大庆市| 怀远县| 丰城市| 屏山县| 永寿县| 文化| 攀枝花市| 安龙县| 钟山县| 县级市| 金沙县| 兖州市| 松滋市| 新余市| 奉贤区| 英超| 富民县| 安阳县| 山西省| 长顺县| 惠安县| 杂多县|