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中使用Tkinter模块创建GUI程序实例
Jan 14 Python
连接Python程序与MySQL的教程
Apr 29 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
在python3环境下的Django中使用MySQL数据库的实例
Aug 29 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 Python
python实现粒子群算法
Oct 15 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
Python 如何利用ffmpeg 处理视频素材
Nov 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
解析php中如何直接执行SHELL
2013/06/28 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
CI框架整合smarty步骤详解
2016/05/19 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
jQuery extend 的简单实例
2013/09/18 Javascript
用js编写的简单的计算器代码程序
2015/08/04 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
js实现楼层导航功能
2017/02/23 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
2018/10/19 Javascript
JS事件绑定的常用方式实例总结
2019/03/02 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python的Flask框架中web表单的教程
2015/04/20 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python 搭建Web站点之Web服务器与Web框架
2016/11/06 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
艺术家策划的室内设计:Curious Egg
2019/03/06 全球购物
罗技美国官网:Logitech美国
2020/01/22 全球购物
DIY手工制作经营店创业计划书
2014/02/01 职场文书
合伙协议书范本
2014/04/21 职场文书
市场拓展计划书
2014/05/03 职场文书
欢迎新生标语
2014/10/06 职场文书
2019脱贫攻坚工作总结报告范本!
2019/08/06 职场文书