Python在线运行代码助手


Posted in Python onJuly 15, 2016

Python代码运行助手可以让你在线输入Python代码,然后通过本机运行的一个Python脚本来执行代码。原理如下:

在网页输入代码:

Python在线运行代码助手

点击Run按钮,代码被发送到本机正在运行的Python代码运行助手;

Python代码运行助手将代码保存为临时文件,然后调用Python解释器执行代码;

网页显示代码执行结果:

Python在线运行代码助手

下载

点击右键,目标另存为:learning.py

备用下载地址:learning.py

完整代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

r'''
learning.py

A Python 3 tutorial from http://www.liaoxuefeng.com

Usage:

python3 learning.py
'''

import sys

def check_version():
 v = sys.version_info
 if v.major == 3 and v.minor >= 4:
  return True
 print('Your current python is %d.%d. Please use Python 3.4.' % (v.major, v.minor))
 return False

if not check_version():
 exit(1)

import os, io, json, subprocess, tempfile
from urllib import parse
from wsgiref.simple_server import make_server

EXEC = sys.executable
PORT = 39093
HOST = 'local.liaoxuefeng.com:%d' % PORT
TEMP = tempfile.mkdtemp(suffix='_py', prefix='learn_python_')
INDEX = 0

def main():
 httpd = make_server('127.0.0.1', PORT, application)
 print('Ready for Python code on port %d...' % PORT)
 httpd.serve_forever()

def get_name():
 global INDEX
 INDEX = INDEX + 1
 return 'test_%d' % INDEX

def write_py(name, code):
 fpath = os.path.join(TEMP, '%s.py' % name)
 with open(fpath, 'w', encoding='utf-8') as f:
  f.write(code)
 print('Code wrote to: %s' % fpath)
 return fpath

def decode(s):
 try:
  return s.decode('utf-8')
 except UnicodeDecodeError:
  return s.decode('gbk')

def application(environ, start_response):
 host = environ.get('HTTP_HOST')
 method = environ.get('REQUEST_METHOD')
 path = environ.get('PATH_INFO')
 if method == 'GET' and path == '/':
  start_response('200 OK', [('Content-Type', 'text/html')])
  return [b'<html><head><title>Learning Python</title></head><body><form method="post" action="/run"><textarea name="code" style="width:90%;height: 600px"></textarea><p><button type="submit">Run</button></p></form></body></html>']
 if method == 'GET' and path == '/env':
  start_response('200 OK', [('Content-Type', 'text/html')])
  L = [b'<html><head><title>ENV</title></head><body>']
  for k, v in environ.items():
   p = '<p>%s = %s' % (k, str(v))
   L.append(p.encode('utf-8'))
  L.append(b'</html>')
  return L
 if host != HOST or method != 'POST' or path != '/run' or not environ.get('CONTENT_TYPE', '').lower().startswith('application/x-www-form-urlencoded'):
  start_response('400 Bad Request', [('Content-Type', 'application/json')])
  return [b'{"error":"bad_request"}']
 s = environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))
 qs = parse.parse_qs(s.decode('utf-8'))
 if not 'code' in qs:
  start_response('400 Bad Request', [('Content-Type', 'application/json')])
  return [b'{"error":"invalid_params"}']
 name = qs['name'][0] if 'name' in qs else get_name()
 code = qs['code'][0]
 headers = [('Content-Type', 'application/json')]
 origin = environ.get('HTTP_ORIGIN', '')
 if origin.find('.liaoxuefeng.com') == -1:
  start_response('400 Bad Request', [('Content-Type', 'application/json')])
  return [b'{"error":"invalid_origin"}']
 headers.append(('Access-Control-Allow-Origin', origin))
 start_response('200 OK', headers)
 r = dict()
 try:
  fpath = write_py(name, code)
  print('Execute: %s %s' % (EXEC, fpath))
  r['output'] = decode(subprocess.check_output([EXEC, fpath], stderr=subprocess.STDOUT, timeout=5))
 except subprocess.CalledProcessError as e:
  r = dict(error='Exception', output=decode(e.output))
 except subprocess.TimeoutExpired as e:
  r = dict(error='Timeout', output='执行超时')
 except subprocess.CalledProcessError as e:
  r = dict(error='Error', output='执行错误')
 print('Execute done.')
 return [json.dumps(r).encode('utf-8')]

if __name__ == '__main__':
 main()

运行

在存放learning.py的目录下运行命令:

C:\Users\michael\Downloads> python learning.py

如果看到Ready for Python code on port 39093...表示运行成功,不要关闭命令行窗口,最小化放到后台运行即可:

Python在线运行代码助手

试试效果

需要支持HTML5的浏览器:

IE >= 9
Firefox
Chrome
Sarafi

Python 相关文章推荐
python中cPickle用法例子分享
Jan 03 Python
使用python统计文件行数示例分享
Feb 21 Python
python实现从ftp服务器下载文件的方法
Apr 30 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
python中scikit-learn机器代码实例
Aug 05 Python
python3去掉string中的标点符号方法
Jan 22 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
python中enumerate() 与zip()函数的使用比较实例分析
Sep 03 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
Python实现画图软件功能方法详解
Jul 28 Python
PyQT5速成教程之Qt Designer介绍与入门
Nov 02 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 #Python
python 性能提升的几种方法
Jul 15 #Python
浅谈Python 对象内存占用
Jul 15 #Python
python发送邮件功能实现代码
Jul 15 #Python
Python中列表和元组的使用方法和区别详解
Dec 30 #Python
Python中的变量和作用域详解
Jul 13 #Python
在Python中通过threading模块定义和调用线程的方法
Jul 12 #Python
You might like
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
jQuery获取json后使用zy_tmpl生成下拉菜单
2015/03/27 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
js程序中美元符号$是什么
2008/06/05 Javascript
16个最流行的JavaScript框架[推荐]
2011/05/29 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
JavaScript onkeypress事件入门实例(按下或按住一个键盘按键)
2014/10/17 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
手机Web APP如何实现分享多平台功能
2016/08/19 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
vue2.0实战之使用vue-cli搭建项目(2)
2017/03/27 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
快速解决vue-cli在ie9+中无效的问题
2018/09/04 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
countup.js实现数字动态叠加效果
2019/10/17 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
django 捕获异常和日志系统过程详解
2019/07/18 Python
Python使用type动态创建类操作示例
2020/02/29 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
大学迎新标语
2014/06/26 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
售后服务承诺函格式
2015/01/21 职场文书
学生检讨书范文
2015/01/27 职场文书
学生检讨书怎么写
2015/05/07 职场文书
正规欠条模板
2015/07/03 职场文书
争做文明公民倡议书
2019/06/24 职场文书
mysql优化
2021/04/06 MySQL
详解JVM系列之内存模型
2021/06/10 Javascript