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 相关文章推荐
pygame实现弹力球及其变速效果
Jul 03 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
Django中Middleware中的函数详解
Jul 18 Python
python深copy和浅copy区别对比解析
Dec 26 Python
Python类继承和多态原理解析
Feb 05 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
Django Path转换器自定义及正则代码实例
May 29 Python
用ldap作为django后端用户登录验证的实现
Dec 07 Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 Python
详解Python调用系统命令的六种方法
Jan 28 Python
python装饰器代码解析
Mar 23 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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
多文件上传的例子
2006/10/09 PHP
PHP与javascript的两种交互方式
2006/10/09 PHP
JS实现php的伪分页
2008/05/25 PHP
preg_match_all使用心得分享
2014/01/31 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
jquery 事件执行检测代码
2009/12/09 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
JavaScript九九乘法口诀表的简单实现
2016/10/04 Javascript
Vue2实现组件props双向绑定
2016/12/02 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
wap手机端解决返回上一页的js实例
2016/12/08 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
python操作oracle的完整教程分享
2018/01/30 Python
对python numpy数组中冒号的使用方法详解
2018/04/17 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python获取命令行输入参数列表的实例代码
2018/06/23 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
Django Rest framework解析器和渲染器详解
2019/07/25 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
html5+css如何实现中间大两头小的轮播效果
2018/12/06 HTML / CSS
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
高二数学教学反思
2016/02/18 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
python代码实现扫码关注公众号登录的实战
2021/11/01 Python
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang