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多线程
Nov 14 Python
Django学习教程之静态文件的调用详解
May 08 Python
python代码过长的换行方法
Jul 19 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
Jul 26 Python
python3+selenium自动化测试框架详解
Mar 17 Python
python环境路径配置以及命令行运行脚本
Apr 02 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Python学习笔记之错误和异常及访问错误消息详解
Aug 08 Python
Python 复平面绘图实例
Nov 21 Python
Python 字典中的所有方法及用法
Jun 10 Python
python实现AdaBoost算法的示例
Oct 03 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
Feb 01 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面向接口编程 耦合设计模式 简单范例
2011/03/23 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
JavaScript中的slice()方法使用详解
2015/06/06 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
微信小程序 setData使用方法及常用错误解决办法
2017/05/11 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
angularjs下拉框空白的解决办法
2017/06/20 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
python实现微信自动回复功能
2018/04/11 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
Python3 用什么IDE开发工具比较好
2020/11/28 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
Bally澳大利亚官网:瑞士奢侈品牌
2018/11/01 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
计算机科学与技术应届生求职信
2013/11/07 职场文书
小学生红领巾广播稿
2014/01/21 职场文书
离职报告范文
2014/11/04 职场文书
2016国培研修心得体会
2016/01/08 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
python用tkinter开发的扫雷游戏
2021/06/01 Python
CentOS MySql8 远程连接实战
2022/04/19 MySQL
win10此电脑打不开怎么办 win10双击此电脑无响应的解决办法
2022/07/23 数码科技