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程序中操作文件之flush()方法的使用教程
May 24 Python
Python分治法定义与应用实例详解
Jul 28 Python
点球小游戏python脚本
May 22 Python
基于Python实现定时自动给微信好友发送天气预报
Oct 25 Python
使用Python的toolz库开始函数式编程的方法
Nov 15 Python
Python基于滑动平均思想实现缺失数据填充的方法
Feb 21 Python
10分钟教你用python动画演示深度优先算法搜寻逃出迷宫的路径
Aug 12 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
python爬虫实现获取下一页代码
Mar 13 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
May 25 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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
PHP入门
2006/10/09 PHP
php除数取整示例
2014/04/24 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
2018/01/29 PHP
PHP常见字符串操作函数与用法总结
2019/03/04 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
jQuery 获取/设置/删除DOM元素的属性以a元素为例
2014/05/23 Javascript
AngularJS开发教程之控制器之间的通信方法分析
2016/12/25 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
详解VueJs异步动态加载块
2017/03/09 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
小程序如何获取多个formId实现详解
2019/09/20 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
JavaScript多种图形实现代码实例
2020/06/28 Javascript
vue watch监控对象的简单方法示例
2021/01/07 Vue.js
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
Python编程实现控制cmd命令行显示颜色的方法示例
2017/08/14 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
宝塔面板成功部署Django项目流程(图文)
2020/06/22 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
python 窃取摄像头照片的实现示例
2021/01/08 Python
HTML5 weui使用笔记
2019/11/21 HTML / CSS
什么是命名空间(NameSpace)
2015/11/24 面试题
护理不良事件检讨书
2014/02/06 职场文书
平面设计专业大学生职业规划书
2014/03/12 职场文书
市级文明单位申报材料
2014/05/07 职场文书
药品开票员岗位职责
2015/04/15 职场文书
2015年酒店工作总结
2015/04/28 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
Oracle 多表查询基本语法实例
2022/04/18 Oracle