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根据文件大小打log日志
Oct 09 Python
Python and、or以及and-or语法总结
Apr 14 Python
安装Python的web.py框架并从hello world开始编程
Apr 25 Python
python使用nntp读取新闻组内容的方法
May 08 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
详解使用python crontab设置linux定时任务
Dec 08 Python
python使用正则表达式替换匹配成功的组
Nov 17 Python
python实现数独游戏 java简单实现数独游戏
Mar 30 Python
pandas数据分组和聚合操作方法
Apr 11 Python
python3将视频流保存为本地视频文件
Jun 20 Python
python让列表倒序输出的实例
Jun 25 Python
pycharm下查看python的变量类型和变量内容的方法
Jun 26 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中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
ThinkPHP中RBAC类的四种用法分析
2014/11/24 PHP
PHP模块memcached使用指南
2014/12/08 PHP
php数组去除空值函数分享
2015/02/02 PHP
php实现复制移动文件的方法
2015/07/29 PHP
Laravel 不同生产环境服务器的判断实践
2019/10/15 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
PHP7 新增常量
2021/03/09 PHP
一些常用的JS功能函数代码
2009/06/23 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
2012/05/30 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
JavaScript实现当网页加载完成后执行指定函数的方法
2015/03/21 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
javascript实现简单计算器效果【推荐】
2016/04/19 Javascript
浅谈JS的基础类型与引用类型
2016/09/13 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
vue路由结构可设一层方便动态添加路由操作
2020/08/31 Javascript
基于Vue2实现移动端图片上传、压缩、拖拽排序、拖拽删除功能
2021/01/05 Vue.js
KMP算法精解及其Python版的代码示例
2016/06/01 Python
解决uWSGI的编码问题详解
2017/03/24 Python
在python中按照特定顺序访问字典的方法详解
2018/12/14 Python
浅谈python中get pass用法
2019/03/19 Python
python getpass实现密文实例详解
2019/09/24 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
新手学python应该下哪个版本
2020/06/11 Python
毕业生的求职信范文分享
2013/12/04 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
菜篮子工程实施方案
2014/03/08 职场文书
小学班级特色活动方案
2014/08/31 职场文书
学生会部长竞选稿
2015/11/19 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书