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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
python图像处理之反色实现方法
May 30 Python
使用Python导出Excel图表以及导出为图片的方法
Nov 07 Python
python3 发送任意文件邮件的实例
Jan 23 Python
python在TXT文件中按照某一字符串取出该字符串所在的行方法
Dec 10 Python
关于Python 的简单栅格图像边界提取方法
Jul 05 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
Python中filter与lambda的结合使用详解
Dec 24 Python
使用keras根据层名称来初始化网络
May 21 Python
Python正则表达式如何匹配中文
May 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源代码
2006/10/09 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
提高网站信任度的技巧
2008/10/17 Javascript
将string解析为json的几种方式小结
2010/11/11 Javascript
jquery中prop()方法和attr()方法的区别浅析
2013/09/06 Javascript
jQuery中.live()方法的用法深入解析
2013/12/30 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
如何解决谷歌浏览器下jquery无法获取图片的尺寸
2015/09/10 Javascript
javascript求日期差的方法
2016/03/02 Javascript
JavaScript实现点击文本自动定位到下拉框选中操作
2016/06/15 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
JS获取本地地址及天气的方法实例小结
2019/05/10 Javascript
python+pygame简单画板实现代码实例
2017/12/13 Python
Python中正则表达式的用法总结
2019/02/22 Python
Python3实现的反转单链表算法示例
2019/03/08 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
django列表筛选功能的实现代码
2020/03/27 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
Html5原创俄罗斯方块(基于canvas)
2019/01/07 HTML / CSS
顶撞领导检讨书
2014/01/29 职场文书
经济信息系毕业生自荐信
2014/06/02 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
公司合并协议书范本
2014/09/30 职场文书
公司委托书格式范文
2014/10/09 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
开学第一周总结
2015/07/16 职场文书
MongoDB日志切割的三种方式总结
2021/09/15 MongoDB
Nginx工作模式及代理配置的使用细节
2022/03/21 Servers
Python Pandas解析读写 CSV 文件
2022/04/11 Python