前几天,一个朋友提出了一个建议,如何用python写出python的解释器,我感觉这是一个很好的问题,于是就去看看,打算用python写一个试试,后来我发现一个事情,python里面的subprocess算是一个很有趣的东西,他可以解释python自己的代码,之后就有个想法了,尝试用subprocess去写一个在线运行python的网站。
那今天我们就来分享一下,如何使用python去写一个在线python吧!
首先,这个东西是结合python的flask框架来完成的。先介绍一下flask框架:
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
使用终端,运行命令提示符CMD,执行:
pip install Flask
在做我们的工作之前先来了解一下flask框架是怎样的一个运行机制吧:
首先创建一个flaskrun.py文件(先写个demo,后面在这个基础上改改,就可以作为网站后端的接口了)
每个函数的上面都有修饰器,这个就代表他的路由,比如说@app.route('/'),它就指定了,下面这个函数所在的地址是127.0.0.1:5000/(默认端口是5000,可以手动在run方法中修改)
这个文件运行首先我们在没设置app文件的情况下,需要先设置一下,并且开成调试模式,再去运行:
set FLASK_APP=flaskrun.py
set FLASK_DEBUG=1
flask run
run了之后,服务会起了,就会跳出这样的界面。
那我们现在就可以去访问路由了,现在我们想访问index方法,我们就输入路由:
如果我们想访问hello方法,这个时候我们就需要加上/hello的路由了:
这样我们就进入了/hello的方法了,每个方法对应一个路由,包含最后一个post也是一样:
下面我们还要介绍的是报错机制:
在路由或者访问数据不对的情况下,我们一般得不到正确的结果,这个时候我们就需要来看看flask对于错误是如何进行解释的了。
flask对于错误也有个修饰器,叫@app.errorhandler() ,括号里面跟错误代码,例如,无法找到页面就可以这么写:@app.errorhandler(404)
当然还有一些其他的错误,例如400,500,405等错误,我们都可以捕捉:
ok,flask介绍完毕,我们下面进入正轨了,用subprocess来写python了。创建一个文件叫:pyol.py
首先导入要用的包:
import os,sys,subprocess,tempfile,time (敲代码的时候建议大家还是分开敲,连起来写虽然也支持,但是事实上是不规范的,建议分开写)
在这里我们还需要用到临时文件夹,这个文件夹我们在运行python的时候会用到。
TempFile = tempfile.mkdtemp(suffix='_test', prefix='python_')
FileNum = int(time.time()*1000)
下面一点比较关键的是,我们需要用到sys模块里的executable方法来获取python编译器的位置(就是它,才能解读python代码),
EXEC=sys.executable
下面我们需要定义编码方式:
def decode(s):
try:
return s.decode('utf-8')
except UnicodeDecodeError:
return s.decode('gbk')
在默认情况下都是以utf-8的情况下进行编码。
下面我们需要将用户写进来的python代码写入文件:
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
下面我们需要在在一个主函数中定义执行方法,我们此时就需要用到subprocess 的check_output方法返回子进程的输出结果(check_output 是 父进程等待子进程完成,返回子进程向标准输出的输出结果 )
outdata = decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))
将返回结果输出:
r['output'] = outdata
最后退出程序并删除文件:
try:
os.remove(fpath)
except Exception as e:
exit(1)
但是实际上这个临时文件本身也会自动删除,这步其实也算是多余的。这样我们的python就写好了。下面只需要把它加入路由,把用户输入的数据以post的方式提交即可。
我们在flaskrun.py文件里导入以下模块:
from flask import Flask
from flask import request
from flask import Response
import json
import pyol
我们需要定义一个返回的头部:
def Response_headers(content):
resp = Response(content)
resp.headers['Access-Control-Allow-Origin'] = '*'
return resp
之后我们来写post请求的接口:
@app.route('/run',methods=['POST'])
def run():
if request.method == 'POST' and request.form['code']:
code = request.form['code']
print(code)
jsondata = pyol.main(code)
return Response_headers(str(jsondata))
我们指定他的路由为/run,采用post的方式传递数据,调用刚刚写的主函数的执行代码,来执行用户传入的code,最后将执行结果返回给用户。
最后我们运行代码:
if __name__ == '__main__':
app.run(host='0.0.0.0',port=1234,debug=True)
最后完整加上优化后代码如下:
pyol.py
flaskrun.py
我们现在需要借助postman来看一下run的结果,首先我们先run一下代码
(flask run):
之后我们打开postman
瞬间就完成了。
之后我们只要写个前端,把这个接口给前端调就大功告成了!
相关推荐
运用python写个二维码
《用Python写网络爬虫》讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的三种方法,提取缓存中的数据,使用多个线程和进程来进行并发抓取,如何抓取动态页面中的内容,与表单进行...
本项目利用Python编写了一个比赛抽签软件,旨在帮助组织者轻松进行随机抽签操作,确保比赛的公平性。这个软件尤其适合那些需要对参赛者进行随机配对或分组的比赛活动。 首先,我们来了解一下Python在这个抽签软件中...
这是由Python写的网站源码,采用了Python里最强大的后端框架Django,该网站所实现的功能是为旅游者提供乡间小屋预订、租住服务,对希望学习利用Python+Django进行网站建设的开发者而言是一个难得的示例。
python读写excel
这个"用python和pythonOCC写的一个简单的CAD程序"虽然描述中提到相当简陋,且许多功能尚未实现,但它展示了如何使用Python和PythonOCC来构建基础的CAD应用。用户可以绘制基本的几何体,如立方体(块体)、球体、圆锥...
python 使用 snap7 实现西门子 plc 1200的读写 地址读写
基于Python的在线投票网站设计源码,该项目包含37个文件,主要文件类型有11个python源文件,11个pyc字节码文件,以及4个xml配置文件。此外,还包括3个html页面文件,2个Markdown文档用于项目说明,1个LICENSE许可...
《用Python写网络爬虫》讲解了如何使用Python来编写网络爬虫程序,内容包括网络爬虫简介,从页面中抓取数据的三种方法,提取缓存中的数据,使用多个线程和进程来进行并发抓取,如何抓取动态页面中的内容,与表单进行...
用python 写一个猜拳小游戏
python写的一个简单的web server,计算机网路课堂研讨要求实现的,哈哈
Python 使用Pandas实现数据库的读、写操作 Python源码Python 使用Pandas实现数据库的读、写操作 Python源码Python 使用Pandas实现数据库的读、写操作 Python源码Python 使用Pandas实现数据库的读、写操作 Python源码...
标题中的“python写的小东西”很可能是指一个使用Python编程语言编写的小型应用程序或脚本。Python因其简洁明了的语法和强大的功能而受到广大程序员的喜爱,尤其适合开发各种实用工具和小型项目。在这个场景中,可能...
Richard Lawson著,李斌译的《用python写网络爬虫》(人民邮电出版社)一书,是python爬虫的经典之作,书中的程序在https://bitbucket.org/wswp/code/src/都有,开源免费,但是不是很方便一次性下载。 这个压缩包中...
python读写MySQL数据库操作,读操作,写操作,python读写MySQL数据库操作
在线编程Python网站
然而程序员是一个苦比的职业,大部分时间都对着电脑,我现在颈椎就不好了,有时候眼睛还疼,我还没20阿,伤心…于是乎写了一个小程序,指定时间会打开浏览器播放一段音乐,提醒我们休息一会儿,防止我们猝死,说多了...
python智能时钟 适合新手研究 提升写代码的兴趣爱好
Python全套教程 Python基础python基础课代码+文档2023最新教程【樵夫教你学Python】Python全套教程 Python基础python基础课代码+文档2023最新教程【樵夫教你学Python】Python全套教程 Python基础python基础课代码+...