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在线编译器的简单原理及简单实现代码相关推荐
- 【原创】用 Python 反编译 Python 软件
[原创]用 Python 反编译 Python 软件 标 题: [原创]用 Python 反编译 Python 软件 作 者: Ptero 时 间: 2010-04-21,16:28:27 链 接: ...
- python在线编译-在线编译python
广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 尝试通过源码自己编译 python,使用的系统是 ubuntu14.04 ...
- python在线编辑器编译excel_python在线编译器的简单原理及简单实现代码
我们先来看一下效果(简单的写了一个): 原理:将post请求的代码数据写入了服务器的一个文件,然后用服务器的python编译器执行返回结果 实现代码: #flaskrun.py # -*- codin ...
- 在线python编程编译器-python在线编译器的简单原理及简单实现代码
我们先来看一下效果(简单的写了一个): 原理:将post请求的代码数据写入了服务器的一个文件,然后用服务器的python编译器执行返回结果 实现代码: #flaskrun.py # -*- codin ...
- 在线编译linux,在线就能用的Linux我给你找好了
原标题:在线就能用的Linux我给你找好了 来源:公众号[编程珠玑] 作者:守望先生 是不是不想装虚拟机,还想体验一下Linux?是不是自己的电脑不在,又想搞事情?今天给大家推荐几个在线就可以玩的Li ...
- mysql主从同步简单原理_MYSQL简单主从复制原理及实现
mysql主从复制原理: Master会对数据库产生修改的语句记录到二进制日志中,在Slave中会有一个线程(IO thread)会向Master请求二进制日志中发生的事件,Master通过binlo ...
- Lightly 在线编译
编译器(compiler)是一种计算机程序,它可以将 C.C++.Java 等高级编程语言写成的源代码转化成汇编语言或机器代码. 现代编译器的主要工作流程如下: 一般的文本编辑器(text edito ...
- java在线编译(JAVA编译过程)
听说有一个Java在线编译网站 你可以上网搜索150 SCJP Questions And Answers关键字. 下面是这个网站,请用斜线代替加号,用点代替句号,前面加上http. it.caree ...
- HC595简单原理及proteus仿真(一)草履虫能听懂版
简单原理 目录 简单原理 简介: 特性 : 引脚功能: proteus仿真 接线: 注意: SH_CP,ST_CP,DS如何工作 实验一: 实验一: 实验三: END: hc595是具有三态输出寄存器 ...
最新文章
- 每周一个 Python 模块 | time
- 【技术综述】“看透”神经网络
- 【2018.5.19】模拟赛之三-ssl2434 取数【搜索,卡常或记忆化搜索】
- 第一百三十三期:MySQL锁会不会,你就差看一看咯
- RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看
- vlf 用法_什么是SQL虚拟日志文件(又名SQL Server VLF)?
- Harmony OS — Text文本框
- javaScript中的变量作用域的闭包处理
- ajax谷歌浏览器没缓存,从缓存AJAX请求会导致Chrome(Prevent Chrome from caching AJA
- java通达信_通达信公式转换JAVA
- Overleaf 指南:30 分钟 LaTeX 入门
- 基于JAVA移动端选课系统设计与实现服务器端计算机毕业设计源码+数据库+lw文档+系统+部署
- 虚拟机安装后找不到操作系统
- 机器学习笔记-阻尼牛顿法
- OpenCV情绪识别(Python实现,超简单)
- 代码随想录Day04 | LeetCode24. 两两交换链表中的节点、LeetCode19. 删除链表的倒数第N个节点、LeetCode160. 链表相交、LeetCode142. 环形链表Ⅱ
- windows开源会有linux吗,微软真的要开源Windows?小伙伴惊呆了!
- 免费DataGridView打印及.NET轻松打印控件(VB打印,C#打印)
- mysql在哪关防火墙_MySQL的防火墙功能
- 讲给后台程序员看的前端系列教程(52)——Bootstrap轮播图