Home  >  Article  >  Backend Development  >  Python online code running assistant

Python online code running assistant

WBOY
WBOYOriginal
2016-08-04 08:55:433696browse

Python code running assistant allows you to enter Python code online and then execute the code through a Python script that runs natively. The principle is as follows:

Enter the code on the webpage:

Click the Run button and the code is sent to the Python code running assistant running on the local machine;

Python code running assistant saves the code as a temporary file, and then calls the Python interpreter to execute the code;

The web page displays the code execution results:

Download

Right click and save the target as: learning.py

Alternate download address: learning.py

Full code:

#!/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()

Run

Run the command in the directory where learning.py is stored:

Copy the code The code is as follows:

C:UsersmichaelDownloads> python learning.py

If you see Ready for Python code on port 39093..., it means the operation is successful. Do not close the command line window, just minimize it and run it in the background:

Try the effect

Requires a browser that supports HTML5:

IE>= 9
Firefox
Chrome
Sarafi

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn