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调用浏览器并打开一个网址的例子
Jun 05 Python
python实现web方式logview的方法
Aug 10 Python
Python中动态创建类实例的方法
Mar 24 Python
python生成1行四列全2矩阵的方法
Aug 04 Python
对python当中不在本路径的py文件的引用详解
Dec 15 Python
python实现自动化上线脚本的示例
Jul 01 Python
pycharm创建scrapy项目教程及遇到的坑解析
Aug 15 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
pytorch学习教程之自定义数据集
Nov 10 Python
详解Python GUI编程之PyQt5入门到实战
Dec 10 Python
通用的Django注册功能模块实现方法
Feb 05 Python
python读取excel数据并且画图的实现示例
Feb 08 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通过header实现文本文件下载的代码
2010/08/08 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
php中apc缓存使用示例
2013/12/25 PHP
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
[原创]静态页面也可以实现预览 列表不同的显示方式
2006/10/14 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
js解决弹窗问题实现班级跳转DIV示例
2014/01/06 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
14款经典网页图片和文字特效的jQuery插件-前端开发必备
2015/08/25 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
2015/11/29 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
Angular 页面跳转时传参问题
2016/08/01 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
jQuery实现html双向绑定功能示例
2017/10/09 jQuery
实例讲解Vue.js中router传参
2018/04/22 Javascript
15个简单的JS编码标准让你的代码更整洁(小结)
2020/07/16 Javascript
[03:27]最受玩家喜爱奖提名:PZH_Element 致玩家寄语
2016/12/20 DOTA
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
跟老齐学Python之字典,你还记得吗?
2014/09/20 Python
Python树莓派学习笔记之UDP传输视频帧操作详解
2019/11/15 Python
pycharm运行scrapy过程图解
2019/11/22 Python
如何用python处理excel表格
2020/06/09 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
Hammitt官网:设计师手袋
2020/05/23 全球购物
2014新课程改革心得体会
2014/03/10 职场文书
小学生操行评语
2014/04/22 职场文书
优秀应届本科生求职信
2014/07/19 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
后进生评语大全
2015/01/04 职场文书
跳高加油稿
2015/07/21 职场文书
Element实现动态表格的示例代码
2021/08/02 Javascript