python線上編譯器的簡單原理及簡單實現代碼,python編譯器

來源:互聯網
上載者:User

python線上編譯器的簡單原理及簡單實現代碼,python編譯器

我們先來看一下效果(簡單的寫了一個):



原理:將post請求的代碼資料寫入了伺服器的一個檔案,然後用伺服器的python編譯器執行返回結果

實現代碼:

#flaskrun.py # -*- coding: utf-8 -*- # __author__="ZJL"  from flask import Flask from flask import request from flask import Response import json import zxby  app = Flask(__name__)   def Response_headers(content):   resp = Response(content)   resp.headers['Access-Control-Allow-Origin'] = '*'   return resp  @app.route('/') def hello_world():   return Response_headers('hello world!!!')  @app.route('/run', methods=['POST']) def run():   if request.method == 'POST' and request.form['code']:     code = request.form['code']     print(code)     jsondata = zxby.main(code)     return Response_headers(str(jsondata))  @app.errorhandler(403) def page_not_found(error):   content = json.dumps({"error_code": "403"})   resp = Response_headers(content)   return resp  @app.errorhandler(404) def page_not_found(error):   content = json.dumps({"error_code": "404"})   resp = Response_headers(content)   return resp  @app.errorhandler(400) def page_not_found(error):   content = json.dumps({"error_code": "400"})   resp = Response_headers(content)   return resp  @app.errorhandler(405) def page_not_found(error):   content = json.dumps({"error_code": "405"})   resp = Response_headers(content)   return resp  @app.errorhandler(410) def page_not_found(error):   content = json.dumps({"error_code": "410"})   resp = Response_headers(content)   return resp  @app.errorhandler(500) def page_not_found(error):   content = json.dumps({"error_code": "500"})   resp = Response_headers(content)   return resp  if __name__ == '__main__':   app.run(debug=True) 
#zxby.py # -*- coding: utf-8 -*- # __author__="ZJL" import os, sys, subprocess, tempfile, time  # 建立臨時檔案夾,返回臨時檔案夾路徑 TempFile = tempfile.mkdtemp(suffix='_test', prefix='python_') # 檔案名稱 FileNum = int(time.time() * 1000) # python編譯器位置 EXEC = sys.executable   # 擷取python版本 def get_version():   v = sys.version_info   version = "python %s.%s" % (v.major, v.minor)   return version   # 獲得py檔案名稱 def get_pyname():   global FileNum   return 'test_%d' % FileNum   # 接收代碼寫入檔案 def write_file(pyname, code):   fpath = os.path.join(TempFile, '%s.py' % pyname)   with open(fpath, 'w', encoding='utf-8') as f:     f.write(code)   print('file path: %s' % fpath)   return fpath   # 編碼 def decode(s):   try:     return s.decode('utf-8')   except UnicodeDecodeError:     return s.decode('gbk')    # 主執行函數   def main(code):   r = dict()   r["version"] = get_version()   pyname = get_pyname()   fpath = write_file(pyname, code)   try:     # subprocess.check_output 是 父進程等待子進程完成,返回子進程向標準輸出的輸出結果     # stderr是標準輸出的類型     outdata = decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))   except subprocess.CalledProcessError as e:     # e.output是錯誤資訊標準輸出     # 錯誤返回的資料     r["code"] = 'Error'     r["output"] = decode(e.output)     return r   else:     # 成功返回的資料     r['output'] = outdata     r["code"] = "Success"     return r   finally:     # 刪除檔案(其實不用刪除臨時檔案會自動刪除)     try:       os.remove(fpath)     except Exception as e:       exit(1)  if __name__ == '__main__':   code = "print(11);print(22)"   print(main(code)) 

運行app.run()方法,通過post提交代碼,就ok了。我們可以對輸出結過做進一步的處理,我這隻是為瞭解一下原理,就沒繼續了。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.