python在线编译器的简单原理及简单实现代码


Posted in Python onFebruary 02, 2018

我们先来看一下效果(简单的写了一个):

python在线编译器的简单原理及简单实现代码

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了。我们可以对输出结过做进一步的处理,我这只是为了解一下原理,就没继续了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python自定义函数的创建、调用和函数的参数详解
Mar 11 Python
Python multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
Python使用Supervisor来管理进程的方法
May 28 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
基于Python函数的作用域规则和闭包(详解)
Nov 29 Python
单利模式及python实现方式详解
Mar 20 Python
python利用微信公众号实现报警功能
Jun 10 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
windows上安装python3教程以及环境变量配置详解
Jul 18 Python
python中调试或排错的五种方法示例
Sep 12 Python
python如何爬取动态网站
Sep 09 Python
使用Python进行AES加密和解密的示例代码
Feb 02 #Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
Feb 02 #Python
Python无损音乐搜索引擎实现代码
Feb 02 #Python
Python面向对象class类属性及子类用法分析
Feb 02 #Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 #Python
Python星号*与**用法分析
Feb 02 #Python
Python模块WSGI使用详解
Feb 02 #Python
You might like
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
Laravel框架实现redis集群的方法分析
2017/09/14 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
PHP使用Session实现上传进度功能详解
2019/08/06 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
jQuery EasyUI 开源插件套装 完全替代ExtJS
2010/03/24 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
javascript实现二叉树遍历的代码
2017/06/08 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
处理JavaScript值为undefined的7个小技巧
2020/07/28 Javascript
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
解析Python中的eval()、exec()及其相关函数
2017/12/20 Python
Python编程实现的简单神经网络算法示例
2018/01/26 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
python pycharm的安装及其使用
2019/10/11 Python
HTML5中的Web Notification桌面右下角通知功能的实现
2018/04/19 HTML / CSS
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
毕业生应聘幼儿园的自荐信
2013/11/20 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
体育专业自荐书
2014/05/29 职场文书
党的群众路线教育实践活动对照检查材料(四风)
2014/09/27 职场文书
离婚财产分隔协议书
2014/10/23 职场文书
初中化学教学反思
2016/02/22 职场文书
网络安全倡议书(3篇)
2019/09/18 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
go语言中fallthrough的用法说明
2021/05/06 Golang
background-position百分比原理详解
2021/05/08 HTML / CSS
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL