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下Fabric的简单部署方法
Jul 14 Python
python如何去除字符串中不想要的字符
Jul 05 Python
Python实现的读取/更改/写入xml文件操作示例
Aug 30 Python
python远程调用rpc模块xmlrpclib的方法
Jan 11 Python
python中count函数简单的实例讲解
Feb 06 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
Python利用FFT进行简单滤波的实现
Feb 26 Python
python logging.info在终端没输出的解决
May 12 Python
python中如何设置代码自动提示
Jul 15 Python
如何使用Python对NetCDF数据做空间相关分析
Apr 21 Python
win10+anaconda安装yolov5的方法及问题解决方案
Apr 29 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
php 获取select下拉列表框的值
2010/05/08 PHP
php中inlcude()性能对比详解
2012/09/16 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
关于jQuery object and DOM element
2013/04/15 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
JavaScript中的toDateString()方法使用详解
2015/06/12 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue 计时器组件的实现代码
2017/09/14 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
[48:23]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第一局
2016/03/05 DOTA
Python多线程编程简单介绍
2015/04/13 Python
python实现颜色空间转换程序(Tkinter)
2015/12/31 Python
python如何统计序列中元素
2020/07/31 Python
使用tensorflow实现线性svm
2018/09/07 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python3跳出一个循环的实例操作
2020/08/18 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
html5 canvas-2.用canvas制作一个猜字母的小游戏
2013/01/07 HTML / CSS
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
计算机网络专业求职信
2014/06/05 职场文书
外贸业务员求职信
2014/06/16 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android
Vue深入理解插槽slot的使用
2022/08/05 Vue.js