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自动连接ssh的方法
Mar 07 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
python实现狄克斯特拉算法
Jan 17 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Python利用scapy实现ARP欺骗的方法
Jul 23 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
总结Pyinstaller的坑及终极解决方法(小结)
Sep 21 Python
Python中logging日志的四个等级和使用
Nov 17 Python
python 使用tkinter+you-get实现视频下载器
Nov 17 Python
python实现PolynomialFeatures多项式的方法
Jan 06 Python
python字符串常规操作大全
May 02 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
php实现的CSS更新类实例
2014/09/22 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
php获取文件后缀的9种方法
2016/03/22 PHP
php错误日志简单配置方法
2016/07/11 PHP
PHP用continue跳过本次循环中剩余代码的注意点
2017/06/27 PHP
JavaScript格式化数字的函数代码
2010/11/30 Javascript
angular.element方法汇总
2015/01/07 Javascript
js简单实现点击左右运动的方法
2015/04/10 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
js数据类型检测总结
2018/08/05 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
Vue 配合eiement动态路由,权限验证的方法
2018/09/26 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Python面向对象编程之继承与多态详解
2018/01/16 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
使用tensorflow实现线性svm
2018/09/07 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
pandas DataFrame行或列的删除方法的实现示例
2019/08/02 Python
Python PyInstaller库基本使用方法分析
2019/12/12 Python
pycharm第三方库安装失败的问题及解决经验分享
2020/05/09 Python
css3编写浏览器背景渐变背景色的方法
2018/03/05 HTML / CSS
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
Invicta手表官方商店:百年制表历史的瑞士腕表品牌
2019/09/26 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
2014年五四青年节活动方案
2014/03/29 职场文书
导师评语大全
2014/04/26 职场文书
小班上学期个人总结
2015/02/12 职场文书
公司财务管理制度
2015/08/04 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python