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 相关文章推荐
Linux下用Python脚本监控目录变化代码分享
May 21 Python
python 重定向获取真实url的方法
May 11 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
Puppeteer使用示例详解
Jun 20 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
jupyter notebook的安装与使用详解
May 18 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
教你怎么用Python操作MySql数据库
May 31 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生成高清缩略图实例详解
2015/12/07 PHP
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
几种tab切换详解
2017/02/03 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
vue项目实现表单登录页保存账号和密码到cookie功能
2018/08/31 Javascript
vue props传值失败 输出undefined的解决方法
2018/09/11 Javascript
JS中数据结构之栈
2019/01/01 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
如何阻止小程序遮罩层下方图层滚动
2019/09/05 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
python避免死锁方法实例分析
2015/06/04 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
python构造IP报文实例
2020/05/05 Python
Python如何实现定时器功能
2020/05/28 Python
css3中的calc函数浅析
2018/07/10 HTML / CSS
EMU Australia澳大利亚官网:澳大利亚本土雪地靴品牌
2019/07/24 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
药剂专业学生求职信范文
2013/12/28 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
学生个人评语大全
2015/01/04 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
2015年度班主任自我评价
2015/03/11 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL