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 控制语句
Nov 03 Python
Python用GET方法上传文件
Mar 10 Python
python:socket传输大文件示例
Jan 18 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
Python实现代码统计工具
Sep 19 Python
Python爬取腾讯视频评论的思路详解
Dec 19 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
python属于软件吗
Jun 18 Python
python中如何使用虚拟环境
Oct 14 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 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 调用远程url的六种方法小结
2009/11/02 PHP
phpstrom使用xdebug配置方法
2013/12/17 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php制作的简单验证码识别代码
2016/01/26 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
搭建PhpStorm+PhpStudy开发环境的超详细教程
2020/09/17 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
jQuery Mobile 和 Kendo UI 的比较
2016/05/05 Javascript
jQuery实现倒计时重新发送短信验证码功能示例
2017/01/12 Javascript
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
Electron-vue开发的客户端支付收款工具的实现
2019/05/24 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
在Python中实现贪婪排名算法的教程
2015/04/17 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
在python中实现调用可执行文件.exe的3种方法
2019/07/07 Python
python求平均数、方差、中位数的例子
2019/08/22 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
最新大学职业规划书范文
2013/12/30 职场文书
xxx同志考察材料
2014/02/07 职场文书
农村婚礼主持词
2014/03/13 职场文书
计算机系本科生求职信
2014/05/31 职场文书
联片教研活动总结
2014/07/01 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL