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入门教程之if语句的用法
May 14 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
详解Python的Django框架中Manager方法的使用
Jul 21 Python
详解python时间模块中的datetime模块
Jan 13 Python
Python异常处理操作实例详解
Aug 28 Python
Django处理多用户类型的方法介绍
May 18 Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 Python
Python如何优雅获取本机IP方法
Nov 10 Python
Python3实现mysql连接和数据框的形成(实例代码)
Jan 17 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python 动态绘制爱心的示例
Sep 27 Python
python 如何读、写、解析CSV文件
Mar 03 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
windows7下php开发环境搭建图文教程
2015/01/06 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php对接java现实加签验签的实例
2016/11/25 PHP
js获取url参数的使用扩展实例
2007/12/29 Javascript
基于Jquery的仿Windows Aero弹出窗(漂亮的关闭按钮)
2010/09/28 Javascript
javascript操作css属性
2013/12/30 Javascript
javascript实现Table间隔色以及选择高亮(和动态切换数据)的方法
2015/05/14 Javascript
关于JS中prototype的理解
2015/09/07 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
vue中组件的过渡动画及实现代码
2018/11/21 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
vue h5移动端禁止缩放代码
2019/10/28 Javascript
Typescript3.9 常用新特性一览(推荐)
2020/05/14 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
node.js通过Sequelize 连接MySQL的方法
2020/12/28 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python之re操作方法(详解)
2017/06/14 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
Series和DataFrame使用简单入门
2019/11/13 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
详解Html5中video标签那些属性和方法
2019/07/01 HTML / CSS
2014幼儿园教育教学工作总结
2014/12/17 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
会议主持词结束语
2015/07/03 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
mysql优化
2021/04/06 MySQL
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js