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使用post提交数据到远程url的方法
Apr 29 Python
Python的collections模块中的OrderedDict有序字典
Jul 07 Python
python使用arcpy.mapping模块批量出图
Mar 06 Python
Python操作mysql数据库实现增删查改功能的方法
Jan 15 Python
python psutil库安装教程
Mar 19 Python
python执行系统命令后获取返回值的几种方式集合
May 12 Python
在python中利用opencv简单做图片比对的方法
Jan 24 Python
Python中遍历列表的方法总结
Jun 27 Python
Python dict的常用方法示例代码
Jun 23 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
python3中for循环踩过的坑记录
Dec 14 Python
python多次执行绘制条形图
Apr 20 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
PHP使用递归方式列出当前目录下所有文件的方法
2015/06/02 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP实现对二维数组某个键排序的方法
2016/09/14 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php中引用&的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
jquery图片放大功能简单实现
2013/08/01 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
简易的投票系统以及js刷票思路和方法
2015/04/07 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
js实现将选中内容分享到新浪或腾讯微博
2015/12/16 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
python中黄金分割法实现方法
2015/05/06 Python
Python中交换两个元素的实现方法
2018/06/29 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
python 字典操作提取key,value的方法
2019/06/26 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
python的链表基础知识点
2020/09/13 Python
从Pytorch模型pth文件中读取参数成numpy矩阵的操作
2021/03/04 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
navabi英国:设计师大码女装
2019/06/25 全球购物
外贸英语毕业生自荐信
2013/11/14 职场文书
研讨会主持词
2014/04/02 职场文书
房屋所有权证明
2015/06/19 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
SQL基础查询和LINQ集成化查询
2022/01/18 MySQL