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实现的石头剪子布代码分享
Aug 22 Python
连接Python程序与MySQL的教程
Apr 29 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
May 27 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
Apache部署Django项目图文详解
Jul 30 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
Aug 09 Python
Python笔记之facade模式
Nov 20 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
Python turtle库绘制菱形的3种方式小结
Nov 23 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 开发环境配置(Zend Studio)
2010/04/28 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
详解PHP数组赋值方法
2015/11/07 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
php中yii框架实例用法
2020/12/22 PHP
javascript时区函数介绍
2012/09/14 Javascript
鼠标移到div,浮层显示明细,弹出层与div的上边距左边距重合(示例代码)
2013/12/14 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
用js提交表单解决一个页面有多个提交按钮的问题
2014/09/01 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
Bootstrap零基础入门教程(三)
2016/07/18 Javascript
JS判断浏览器是否安装flash插件的简单方法
2016/09/13 Javascript
AngularJS中transclude用法详解
2016/11/03 Javascript
详解Vuex中mapState的具体用法
2017/09/28 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
Python探索之pLSA实现代码
2017/10/25 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
python numpy存取文件的方式
2020/04/01 Python
Python数据持久化存储实现方法分析
2019/12/21 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Python中过滤字符串列表的方法
2020/12/22 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
Parfumdreams英国:香水和化妆品
2019/05/10 全球购物
个人应聘自我评价分享
2013/11/18 职场文书
挂牌仪式策划方案
2014/05/18 职场文书
2015年教务主任工作总结
2015/07/22 职场文书
员工工作心得体会
2019/05/07 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers
MySQL 开窗函数
2022/02/15 MySQL
KVM基础命令详解
2022/04/30 Servers