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之数据类型总结
Sep 24 Python
Python 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Python编程产生非均匀随机数的几种方法代码分享
Dec 13 Python
python如何实现int函数的方法示例
Feb 19 Python
Python 实现域名解析为ip的方法
Feb 14 Python
pygame实现成语填空游戏
Oct 29 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
python中有函数重载吗
May 28 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
Python语言规范之Pylint的详细用法
Jun 24 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递归调用与静态变量使用
2012/12/16 PHP
php检测文件编码的方法示例
2014/04/25 PHP
php注册和登录界面的实现案例(推荐)
2016/10/24 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
javascript 一段左右两边随屏滚动的代码
2009/06/18 Javascript
取选中的radio的值
2010/01/11 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
jQuery CSS3相结合实现时钟插件
2016/01/08 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
js实现日历与定时器
2017/02/22 Javascript
简单实现js菜单栏切换效果
2017/03/04 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
javascript实现简易的计算器
2020/01/17 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
[01:17]辉夜杯战队访谈宣传片—EHOME
2015/12/25 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python3爬虫学习入门教程
2018/12/11 Python
Python基于字典实现switch case函数调用
2020/07/22 Python
纽约和芝加哥当天送花:Ode à la Rose
2019/07/05 全球购物
网上签名寄语活动留言
2014/01/18 职场文书
中学生自我鉴定
2014/02/04 职场文书
物流专员岗位职责
2014/02/17 职场文书
大学生社会实践方案
2014/05/11 职场文书
交流会主持词
2015/07/02 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
关于python中模块和重载的问题
2021/11/02 Python