1st Online Python Editor With Live Syntax Checking and Execution

Overview

PythonBuddy 🖊️ 🐍

Travis branch Donate
Online Python 3 Programming with Live Pylint Syntax Checking!

Usage

  1. Fetch from repo:
git clone https://github.com/ethanchewy/PythonBuddy.git
  1. Change to PythonBuddy directory
cd PythonBuddy
  1. Create virtualenv based on your own system:
python3 -m venv venv
  1. Activate virtual environment:
source venv/bin/activate
  1. Enusre that your virtualenv uses Python 3.7.6 via this command:
python --version

If you don't use Python Python 3.7.6, some Python libraries that PythonBuddy relies on may not work. Please refer to this documentation for figuring out how to create a specific version of Python via vitualenv via this StackOverflow post.

  1. Pipe requirements to venv folder:
pip install -r requirements.txt
  1. Change to the PythonBuddy application folder. You should now be in PythonBuddy/PythonBuddy/.
cd PythonBuddy
  1. Set FLASK_APP variable:
export FLASK_APP=app.py
  1. Run flask app:
flask run

Open your browser to localhost:5000 . Voila! 🎉

Current Features:


  • Live Syntax Checking
    • Uses Pylint as checker (only prints out errors and warnings)
    • Syntax Highlighting

  • Python Execution
    • Python Complilation
    • Basic Sandboxing

  • Live Error Table with Additional Help Suggestions

  • Secure (Sandboxed) Version using Docker

    Please check out PythonBuddySandboxed for a fully working web implementation which uses a dockerized version of PythonBuddy called PythonBuddySandbox.

    This builds off of christophetd's docker-python-sandbox and just modifies it so that it runs pylint in the background and processes the pylint messages on the client side.

    To see how he implements it on the web side, please check out https://github.com/christophetd/code-execution-api-demo

    This is still in alpha stage so there might be some bugs. If you want to implement this please check the 4 links above since documentation is a WIP.

    Customization Options

    1. Edit app.py to change any pylint options (like showing/hiding hints warnings)
    2. Security
    3. To create a much more secure Python Environment, consider using my Docker + Node.js implementation: https://github.com/ethanchewy/PythonBuddy#secure-sandboxed-version-using-docker
    4. For versions that used Python 2 or to see older versions, check: https://github.com/ethanchewy/PythonBuddy/releases

    Unit Tests

    To run tests, run this at the root directory:

    pytest
    

    For coverage run the following command in the root directory:

    pytest --cov-report html --cov=PythonBuddy tests/
    

    Future Goals:

    • Make easily embeddable for MOOCs like edX and other education platform
    • Create an analytics system that models the student's python learning and tells them where they need improvement (many programming students learn by copying and pasting and don't actually understand the nuances of the Python language).
    • Stricter Python Sandboxing via Pypy's sandboxing solution
    • Lower CPU usage
    • Allow users to generate a link to a unique code snippet similar to JSBin
    • Unit tests for client side JS

    FAQ:

    Why did you make this?
    In 2014, I was a Community TA at MIT edX 6.00.1x course where I helped teach over 1000 students. The year after I started researching under Prof. Eni Mustafaraj. She had a data set from that course and we saw a high attrition rate of students within the first 2 weeks. After digging through the curriculumn and data, I realized that the students left because of difficulties setting up their Python environment and complex error messages that they couldn't solve when running their code (ex: some students had path issues).

    So, I created PythonBuddy to address this issue so that students wouldn't have to go through the frustrations of setting up a Python environment and running into seemingly "random" bugs. PythonBuddy allows users to jump right into Python programming with the support of live syntax checking & highlighting. Also, professors and teachers could easily set up a server and allow students to quickly test out their code with PythonBuddy online.

    Has anyone created anything like this before?
    There has never been a live syntax checker for python online. Similar projects that are not "live" are http://pep8online.com/ and http://antares.sip.ucm.es/cesar/pylint/

    How can I contribute?
    You can 🌟 star my repo, fork my repo, submit a pull request, and/or open issues!

    Where's the code for embedding it in MOOCs?
    I'm currently working on this over here (for edx specifically): https://github.com/ethanchewy/pybuddy2.0 . If you want to embed this project directly to your site, you would use an iframe:

    <iframe src="https://pythonbuddy.com"></iframe>
    

    I want the code to actually compile and run in a certain way?
    To run PythonBuddy securely, you can check out my implementation of PythonBuddy with Docker and Node.js: https://github.com/ethanchewy/PythonBuddy#secure-sandboxed-version-using-docker. Basically, it dockerizes each user session (similar to creating a virtual machine for each user) and destroys it if it uses too much memory or runs malicious code.
    If you want to actually execute the python in a restricted fashion at my Restricted Python branch: https://github.com/ethanchewy/PythonBuddy/tree/restrictedpython.

    How do I run my own server? Regular: https://github.com/ethanchewy/OnlinePythonLinterSyntaxChecker/wiki
    Sandboxed: https://github.com/ethanchewy/PythonBuddy/wiki/Running-Sandboxed-PythonBuddy

    Press:

    Featured on FlaskCon 2020, Python Weekly, CSS Author, and the Talk Python Podcast

    Credits:

    This was made by Ethan Chiu as a research project under the guidance of Wellesley College professor Eni Mustafaraj.

    Other:

    As of October 2020, PythonBuddy.com will no longer be a demo server for this open-source project due to the increasing costs of hosting it for 80,000+ people monthly. Instead, this URL will redirect back to this GitHub repo.

    How can I support PythonBuddy?

    If you enojyed using this open-source project, please consider donating whatever you can to these organizations that address problems I'm passionate about:

    If you don't have the means to donate to the above, consider checking out some of these free action items and information:

    Comments
    • Update demo gifs with newest version of PythonBuddy

      Update demo gifs with newest version of PythonBuddy

      Problem:

      • GIFs in current Readme(https://github.com/ethanchewy/PythonBuddy/blob/master/README.md) show the earliest version of PythonBuddy.

      Goal:

      • Produce GIFs of the most current version of PythonBuddy and update them in the Readme

      How to do this?

      • Follow Readme instructions on installing
      • Check out what GIFs are currently displayed in README and take videos of exactly the same functions but wiht updated PythonBuddy
      • Load up PythonBuddy in local browser and take screenvideos of site.
      • Convert those clips to GIFs and update readme
      Hacktoberfest 
      opened by ethanchewy 15
    • KeyError: 'file_name' by clicking on the Run button

      KeyError: 'file_name' by clicking on the Run button

      Describe the bug When I start the app, my first test was click on Run button and I've received KeyError: 'file_name'. Before run the app, i've needed to update werkzeug to the last version cuz with the version in requirements.txt the app cannot be run

      To Reproduce Steps to reproduce the behavior:

      1. start application with Flask run (werkzeug updated)
      2. Click on Run button
      3. open your terminal
      4. See error

      Screenshots xxxx

      Desktop (please complete the following information):

      • OS: Ubuntu 20 // windows 10
      • Browser Firefox

      Additional context It happens on my Windows PC and Ubuntu too.

      opened by LeonardoFurtado 9
    • package typed-ast older versions doesn't work on python 3.8?

      package typed-ast older versions doesn't work on python 3.8?

      Hi, Ethan ✌ I just set PythonBuddy in my WSL installation and during the installation of the required packages an error was raised. I was able to fix it so I'm posting the step here in case anyone is interested.

      Steps to reproduce the behavior:

      1. Ubuntu 20.04 on Windows Subsystem for Linux
      2. Python 3.8
      3. Clone the repo, create a virtualenv for it
      4. Try to install the required packages and get the following error:
          Running setup.py install for typed-ast ... error
          ERROR: Command errored out with exit status 1:
           command: /usr/bin/python3 -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-tr7ufsax/typed-ast/setup.py'"'"'; __file__='"'"'/tmp/pip-install-tr7ufsax/typed-ast/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' install --record /tmp/pip-record-qwpgruzh/install-record.txt --single-version-externally-managed --user --prefix= --compile --install-headers /home/marcelo/.local/include/python3.8/typed-ast
               cwd: /tmp/pip-install-tr7ufsax/typed-ast/
          Complete output (23 lines):
          running install
          running build
          running build_py
          creating build
          creating build/lib.linux-x86_64-3.8
          creating build/lib.linux-x86_64-3.8/typed_ast
          copying typed_ast/__init__.py -> build/lib.linux-x86_64-3.8/typed_ast
          copying typed_ast/ast27.py -> build/lib.linux-x86_64-3.8/typed_ast
          copying typed_ast/ast3.py -> build/lib.linux-x86_64-3.8/typed_ast
          copying typed_ast/conversions.py -> build/lib.linux-x86_64-3.8/typed_ast
          running build_ext
          building '_ast27' extension
          creating build/temp.linux-x86_64-3.8
          creating build/temp.linux-x86_64-3.8/ast27
          creating build/temp.linux-x86_64-3.8/ast27/Parser
          creating build/temp.linux-x86_64-3.8/ast27/Python
          creating build/temp.linux-x86_64-3.8/ast27/Custom
          x86_64-linux-gnu-gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Iast27/Include -I/usr/include/python3.8 -c ast27/Parser/acceler.c -o build/temp.linux-x86_64-3.8/ast27/Parser/acceler.o
          ast27/Parser/acceler.c:13:10: fatal error: pgenheaders.h: No such file or directory
             13 | #include "pgenheaders.h"
                |          ^~~~~~~~~~~~~~~
          compilation terminated.
          error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
      

      Expected behavior ´´pip3 install -r should execute without errors´´

      I managed to fix this by upgrading the version of the package that is being accused of raising the error. Someone at Stackoverflow had a similar issue and the solution worked for me here too. Solution:

      Upgrading to typed-ast==1.4.1 worked for me using Python 3.8.5

      After the solution was applied I could install the required packages without errors.

      opened by marceloFA 5
    • Fix Line Number Error on Restricted Python branch

      Fix Line Number Error on Restricted Python branch

      Here's the branch that needs to be fixed: https://github.com/ethanchewy/PythonBuddy/tree/restrictedpython

      Error is pretty simple. The code runs fine and is linted. The line numbers just have to be adjusted correctly. Right now, it displays negative line numbers

      To contribute:

      • Fork this branch.
      • Follow installation instructionsfor testing:
      • Open a pull request and describe your changes. Please only submit fully functional pull requests.
      • If you have any questions, leave it in this thread.
      • Please only do testing on your own local version of PythonBuddy!!

      Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

      bug Hacktoberfest 
      opened by ethanchewy 5
    • The solution for Line Number issue

      The solution for Line Number issue

      Seems like windows and Linux has different error formats, so Linux has line number on position [1] and Windows on position [2] (when you split string by ":")

      opened by vladimir-kirillovskiy 4
    • Adds support for coveralls

      Adds support for coveralls

      Adds setup in .travis.yml to run coverage in travis and report coverage to coveralls.io

      Generated artifacts: https://travis-ci.org/chaps/PythonBuddy/builds/595634318 https://coveralls.io/github/chaps/PythonBuddy

      opened by chaps 3
    • This looks great

      This looks great

      Just exactly what I need. Thank you so much for all of the hard work.

      Forgive me if I make one comment. There are really two parts to this. One is the core server functionality. And the other is the flask app which calls it.

      For those of us who are not using Flask, it would be nice if they were in separate files. Then I would not have to import all of flask to use it.

      Otherwise, it looks like lots of hard work has been done by EthanChewy.
      Thank you so much.

      opened by PythonLinks 3
    • fix example #2 bug

      fix example #2 bug

      For example two, the example code is:

      methods = []
      for i in range(10):
          methodds.append(lambda x: x + i)
      print methods[0](10)
      

      Could you change it to this:

      methods = []
      for i in range(10):
          methods.append(lambda x: x + i)
      print methods[0](10)
      
      opened by Vic-ST 3
    • Make Python Execution More Secure

      Make Python Execution More Secure

      Ideas for achieving this:

      • Using Restricted Python. Check out my branch over here: https://github.com/ethanchewy/PythonBuddy/tree/restrictedpython I basically finished it's implementation. I want to make it a little bit more flexible. The only bug over there is the line number that is being displayed.
      • Process it using PyPy sandbox: http://doc.pypy.org/en/latest/sandbox.html .

      Resources:

      Other Implementations of Python Sandboxes to look at:

      To contribute:

      • Open a pull request and describe your changes. Please only submit fully functional pull requests.
      • If you have any questions, leave it in this thread.
      • Please only do testing on your own local version of PythonBuddy!!

      Thanks!

      Contributors who are approved for pull requests and make significant contributions will be attributed in the Contributing.md file

      Hacktoberfest 
      opened by ethanchewy 3
    • Fix PythonBuddy not working in Windows

      Fix PythonBuddy not working in Windows

      Line Numbers do not show up correctly when PythonBuddy is running on a Windows system.

      Thank you @DirtySoc for raising this up and providing these screenshots: Windows 10 1803 w/ Python3.7: 47252013-2547ee80-d40b-11e8-9fcc-6ebad2e17c44

      Ubuntu 18.01 w/ Python3.6.6: 47252254-a99c7080-d40f-11e8-93f7-7f07dbbbf819

      PythonBuddy was developed for Unix systems so it works on Mac and Ubuntu for example. Unfortunately, the line numbers are not processed correctly in PythonBuddy for Windows. My hunch is that in app.py the data passed in the AJAX calls is formatted differently in Windows systems. Or, there is an issue with creating temp files in Windows system.

      bug Hacktoberfest 
      opened by ethanchewy 2
    • HTTP 414 Request-URI Too Large

      HTTP 414 Request-URI Too Large

      If the code is longer than the server specified allowed request limit (seemingly 8KB) a HTTP 414 error is returned. This is because HTTP GET is used, and can easily be fixed by using HTTP POST.

      E.g. replacing in javascript.js: https://github.com/ethanchewy/PythonBuddy/blob/895ecbcbbe4e7053913af4b60365cf1c3c31f7b1/static/js/javascript.js#L88-L95

      With this:

      $.post('/check_code', {
          text :  code
      }, function(data) {
          current_text = data;
          //Check Text
          check(current_text);
          return false;
      }, 'json');
      

      If this limit is intentional, then there are still better ways to handle it than just "crashing". E.g. just checking the length of the string to be sent to the server beforehand, and telling the user that is the case.

      opened by Chessax 2
    • Who to contact for security issues

      Who to contact for security issues

      Hello 👋

      I run a security community that finds and fixes vulnerabilities in OSS. A researcher (@evanottinger) has found a potential issue, which I would be eager to share with you.

      Could you add a SECURITY.md file with an e-mail address for me to send further details to? GitHub recommends a security policy to ensure issues are responsibly disclosed, and it would help direct researchers in the future.

      Looking forward to hearing from you 👍

      (cc @huntr-helper)

      opened by benharvie 3
    • Deployment on Vercel

      Deployment on Vercel

      Is your feature request related to a problem? Please describe. For easy usage to users, we can deploy it on vercel @vercel

      Describe the solution you'd like Using this: https://vercel.com/docs/runtimes#official-runtimes/python

      Describe alternatives you've considered Heroku Can be used, but it is difficult to configure. Also, its response time is slower in some regions.

      opened by Siddhant-K-code 1
    • Add History of Code Submissions

      Add History of Code Submissions

      As a user, I want to be able to view my previous code submissions.

      Since PythonBuddy is only for 1 user for this repo (for PythonBuddySandboxed aka the demo server, it's different), we can achieve this by either

      1. creating a database and storing each of the submissions. OR
      2. using window.localstorage https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage
      opened by ethanchewy 4
    • Port to PyOdide

      Port to PyOdide

      PyOdide is cPython compiled to WebAssembly and running in the browser.

      If PyLint is pure python, it is quite easy to run it on top of Pyodide, in the browser. If PyLint includes C code, it is not that hard to port it to Pyodide. There is a well developed tool chain.

      Then Python Buddy could run entirely in the browser. No server would be required. I would use it in the ForestWiki.com

      I hope that helps. Christopher Lozinski PythonLinks.com

      opened by PythonLinks 26
    Releases(v3.0.0)
    • v3.0.0(Oct 29, 2020)

      In this release, we updated the packages that Python Buddy relies on. Before, there were bugs with those packages but they have now been fixed so these changes will now fix all Windows compatibility issues and update us to Python 3.7+.

      Source code(tar.gz)
      Source code(zip)
    • 2.0.2(Oct 29, 2018)

    • 2.0.0(Aug 8, 2018)

      The following release implements the following:

      • multiprocessing to handle multiple errors
      • verbose null checks
      • fix various bugs in cm-validator.js and javascript.js that prevented some errors and warnings from being presented
      • leverage sessions to handle multiple users at scale
      • redesign code to make more readable/cleaner
      • Update pylint and error messages related to pylint for more info (from pylint --list-msgs)
      • Process pylint messages on server side now.
      Source code(tar.gz)
      Source code(zip)
    Owner
    Ethan Chiu
    code for humanity
    Ethan Chiu
    System Information Utility With Python

    System-Information-Utility This is a simple utility, for the terminal, which allows you to find out information about your PC. It's very easy to run t

    2 Apr 15, 2022
    Your self-hosted bookmark archive. Free and open source.

    Your self-hosted bookmark archive. Free and open source. Contents About LinkAce Support Setup Contribution About LinkAce LinkAce is a self-hosted arch

    Kevin Woblick 1.7k Jan 03, 2023
    The most hackable keyboard in all the land

    MiRage Modular Keyboard © 2021 Zack Freedman of Voidstar Lab Licensed Creative Commons 4.0 Attribution Noncommercial Share-Alike The MiRage is a 60% o

    Zack Freedman 558 Dec 30, 2022
    An Advent calendar of small programming puzzles for a variety of skill sets and skill levels.

    Advent of Code 2021 The Advent of Code is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be sol

    Evan Cope 0 Feb 13, 2022
    Trusted sessions for falcon using itsdangerous.

    Falcon signed sessions This project allows you to easily add trusted cookies to falcon, it works by storing a signed cookie in the client's browser us

    Ward 1 Feb 08, 2022
    Run-Your-Own Firefox Sync Server

    Run-Your-Own Firefox Sync Server This is an all-in-one package for running a self-hosted Firefox Sync server. It bundles the "tokenserver" project for

    Mozilla Services 1.7k Dec 30, 2022
    Perform oocyst segmentation in mercurochrome stained mosquito midgut

    Midgut_oocyst_segmentation Perform oocyst segmentation in mercurochrome stained mosquito midguts This oocyst segmentation model also powers the webtoo

    Duo Peng 3 Oct 27, 2021
    Different steganography methods with examples and my own small image database

    literally-the-most-useless-project [Different steganography methods with examples and my own small image database] This project currently contains thr

    Kamyishka 1 Dec 09, 2022
    A basic layout of atm working of my local database

    Software for working Banking service 😄 This project was developed for Banking service. mysql server is required To have mysql server on your system u

    satya 1 Oct 21, 2021
    Ergonomic option parser on top of dataclasses, inspired by structopt.

    oppapī Ergonomic option parser on top of dataclasses, inspired by structopt. Usage from typing import Optional from oppapi import from_args, oppapi @

    yukinarit 4 Jul 19, 2022
    Simple web application, which has a single endpoint, dedicated to annotation parsing and convertion.

    Simple web application, which has a single endpoint, dedicated to annotation parsing and conversion.

    Pavel Paranin 1 Nov 01, 2021
    a package that provides a marketstrategy for whitelisting on golem

    filterms a package that provides a marketstrategy for whitelisting on golem watching requestor logs distribute 10 tasks asynchronously is fun. but you

    KJM 3 Aug 03, 2022
    BlackMamba is a multi client C2/post exploitation framework

    BlackMamba is a multi client C2/post exploitation framework with some spyware features. Powered by Python 3.8.6 and QT Framework.

    Gustavo 873 Dec 29, 2022
    A Notifier Program that Notifies you to relax your eyes Every 15 Minutes👀

    Every 15 Minutes is an application that is used to Notify you to Relax your eyes Every 15 Minutes, This is fully made with Python and also with the us

    FSP Gang s' YT 2 Nov 11, 2021
    Random pass word generator made with python. PyQt5 module is used to design GUI.

    Differences in this GUI program : Default titlebar removed Custom Minimize,Maximize and Close Buttons Drag & move window from any point Program work l

    Dimuth De Zoysa 1 Jan 26, 2022
    A redesign of our previous Python World Cup, aiming to simulate the 2022 World Cup all the way from the qualifiers

    A redesign of our previous Python World Cup, aiming to simulate the 2022 World Cup all the way from the qualifiers. This new version is designed to be more compact and more efficient and will reflect

    Sam Counsell 1 Jan 07, 2022
    Compress .dds file in ggpk to boost fps. This is a python rewrite of PoeTexureResizer.

    PoeBooster Compress .dds file in ggpk to boost fps. This is a python rewrite of PoeTexureResizer. Setup Install ImageMagick-7.1.0. Download and unzip

    3 Sep 30, 2022
    A basic tool to generate Hydrogen drum machine kits.

    Generate Hydrogen Kit A basic tool to generate drumkit.xml files for Hydrogen drum machine. Saves a bit of time when making kits. Supply it with a nam

    Luna Langton 2 Nov 28, 2021
    UdemyPy is a bot that hourly looks for Udemy free courses and post them in my Telegram Channel: Free Courses.

    UdemyPy UdemyPy is a bot that hourly looks for Udemy free courses and post them in my Telegram Channel: Free Courses. How does it work? For publishing

    88 Dec 25, 2022
    Analyze FnO trends by using NSE Bhav copy

    BhavFnO Analyze FnO trends by using NSE Bhav copy Download entire BhavFnO folder and unzip it In that folder open command window

    33 Jan 04, 2023