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实现查询IP地址所在地
Mar 29 Python
在Python的Flask框架中使用模版的入门教程
Apr 20 Python
python批量替换页眉页脚实例代码
Jan 22 Python
将python代码和注释分离的方法
Apr 21 Python
python3 flask实现文件上传功能
Mar 20 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
使用pycharm在本地开发并实时同步到服务器
Aug 02 Python
Python中调用其他程序的方式详解
Aug 06 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
python django 原生sql 获取数据的例子
Aug 14 Python
python中的 zip函数详解及用法举例
Feb 16 Python
Python如何实现邮件功能
May 27 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
对Session和Cookie的区分与解释
2007/03/16 PHP
php中通过curl检测页面是否被百度收录
2013/09/27 PHP
win7计划任务定时执行PHP脚本设置图解
2014/05/09 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
nodejs npm package.json中文文档
2014/09/04 NodeJs
js实现简单锁屏功能实例
2015/05/27 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
基于jQuery实现的旋转彩圈实例
2015/06/26 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
javascript如何实现create方法
2019/11/04 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
python获得图片base64编码示例
2014/01/16 Python
Python 元组(Tuple)操作详解
2014/03/11 Python
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
python切片(获取一个子列表(数组))详解
2019/08/09 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
Python(PyS60)实现简单语音整点报时
2019/11/18 Python
Python基础之字典常见操作经典实例详解
2020/02/26 Python
环法自行车赛官方商店:Le Tour de France
2017/08/27 全球购物
Java面试题及答案
2012/09/08 面试题
音乐表演专业毕业生求职信
2013/10/14 职场文书
网络程序员自荐信
2014/01/25 职场文书
学生生病请假条范文
2014/02/16 职场文书
乡镇三项教育实施方案
2014/03/30 职场文书
相亲活动方案
2014/08/26 职场文书
旷工辞退通知书
2015/04/17 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
js前端面试常见浏览器缓存强缓存及协商缓存实例
2022/06/21 Javascript