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中统计函数运行耗时的方法
May 05 Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
解决Python网页爬虫之中文乱码问题
May 11 Python
python抓取搜狗微信公众号文章
Apr 01 Python
提升Python程序性能的7个习惯
Apr 14 Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 Python
python实现将文件夹内的每张图片批量分割成多张
Jul 22 Python
Django框架序列化与反序列化操作详解
Nov 01 Python
利用Python如何实时检测自身内存占用
May 09 Python
Python如何根据时间序列数据作图
May 12 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
Python实现钉钉/企业微信自动打卡的示例代码
Feb 02 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/02/11 PHP
Yii2 RESTful中api的使用及开发实例详解
2016/07/06 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
JavaScipt中的Math.ceil() 、Math.floor() 、Math.round() 三个函数的理解
2010/04/29 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
python制作抽奖程序代码详解
2021/01/15 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
全球领先的鞋类零售商:The Walking Company
2016/07/21 全球购物
nohup的用法
2012/11/26 面试题
学习党课思想汇报
2013/12/29 职场文书
工作失职检讨书范文
2014/01/16 职场文书
料理师求职信
2014/01/30 职场文书
年度考核表个人总结
2015/03/06 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
运动会主持词大全
2015/07/02 职场文书
高一军训感想
2015/08/07 职场文书
小学数学教师研修感悟
2015/11/18 职场文书