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中的正则表达式的用法
Apr 09 Python
Python简单的制作图片验证码实例
May 31 Python
Python基础之getpass模块详细介绍
Aug 10 Python
解决python3中解压zip文件是文件名乱码的问题
Mar 22 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
Aug 07 Python
python3实现字符串操作的实例代码
Apr 16 Python
10分钟用python搭建一个超好用的CMDB系统
Jul 17 Python
Python logging设置和logger解析
Aug 28 Python
python 用struct模块解决黏包问题
Nov 07 Python
python各种excel写入方式的速度对比
Nov 10 Python
Python Process创建进程的2种方法详解
Jan 25 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
Feb 22 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
php 前一天或后一天的日期
2008/06/28 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php把大写命名转换成下划线分割命名
2015/04/27 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php实现HTML实体编号与非ASCII字符串相互转换类实例
2016/11/02 PHP
创建无限极分类树型结构的简单方法
2017/06/20 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
javascript 不间断的图片滚动并可点击
2010/01/15 Javascript
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
javascript基本算法汇总
2016/03/09 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
详解Angular路由之路由守卫
2018/05/10 Javascript
Vue项目查看当前使用的elementUI版本的方法
2018/09/27 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
在Python中利用pickle保存变量的实例
2019/12/30 Python
Python chardet库识别编码原理解析
2020/02/18 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
VICHY薇姿美国官方网站:欧洲药房第一的抗衰老品牌
2017/11/22 全球购物
秘书行业自我鉴定范文
2013/12/30 职场文书
大堂副理的岗位职责范文
2014/02/17 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
爱国主义影片观后感
2015/06/18 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书
学习心得体会
2019/06/20 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
基于Python实现nc批量转tif格式
2022/08/14 Python