[Python] Python Tutor + Google Colab

Discussão em 'Python' iniciado por Stack, Janeiro 22, 2025.

  1. Stack

    Stack Membro Participativo

    Preambula. I'm trying to use Google Colab to teach students Python. The problem is, there is no nice tool to visualize code execution. I tried to use Python Tutor by integrating it with the Google Colab, namely created a "magic command"

    from IPython.core.magic import Magics, magics_class, cell_magic, line_magic

    @magics_class
    class Helper(Magics):

    def __init__(self, shell=None, **kwargs):
    super().__init__(shell=shell, **kwargs)

    @cell_magic
    def debug_cell_with_pytutor(self, line, cell):
    import urllib.parse
    url_src = urllib.parse.quote(cell)
    str_begin = '<iframe width="1000" height="500" frameborder="0" src="https://pythontutor.com/iframe-embed.html#code='
    str_end = '&cumulative=false&py=3&curInstr=0"></iframe>'
    import IPython
    from google.colab import output
    display(IPython.display.HTML(str_begin+url_src+str_end))

    get_ipython().register_magics(Helper)


    that can be later used as

    %%debug_cell_with_pytutor

    total_list = []
    for i in range(3):
    total_list.append(i)
    total_list


    The problem. There are actually two problems:

    • Python Tutor often refuses to process not-so-complicated code like creating a class with few methods. On the other hand, I was able to start Python Tutor locally and it did not fail.
    • I'm not happy with the fact that two different Pythons are used -- the one in Colab and the one in Python Tutor

    What help am I seeking for. I would like to either start Python Tutor in Google Colab, or find any other nice visualization tool that may work in Colab.

    Thank you in advance!

    UPDATE

    At the end of the day I was able to find some solution, but it is quite messy. I'll be glad if anyone proposes something better.

    At the moment the code looks like

    #@title #Helper functions (debugger)

    !curl -O https://raw.githubusercontent.com/fbeilstein/machine_learning/master/pytutor/data_begin.html
    !curl -O https://raw.githubusercontent.com/fbeilstein/machine_learning/master/pytutor/data_end.html
    !curl -O https://raw.githubusercontent.com/fbeilstein/machine_learning/master/pytutor/pg_encoder.py
    !curl -O https://raw.githubusercontent.com/fbeilstein/machine_learning/master/pytutor/pg_logger.py

    from IPython.core.magic import Magics, magics_class, cell_magic, line_magic

    @magics_class
    class Helper(Magics):

    def __init__(self, shell=None, **kwargs):
    super().__init__(shell=shell, **kwargs)
    with open('data_begin.html', 'r') as f_in:
    lines = f_in.readlines()
    self.begin_debug = "".join(lines)
    with open('data_end.html', 'r') as f_in:
    lines = f_in.readlines()
    self.end_debug = "".join(lines)

    @cell_magic
    def debug_cell_with_pytutor(self, line, cell):
    import json
    import bdb
    from pg_logger import PGLogger
    import IPython
    from google.colab import output

    def cgi_finalizer(input_code, output_trace):
    ret = dict(code=input_code, trace=output_trace)
    json_output = json.dumps(ret, indent=None) # use indent=None for most compact repr
    display(IPython.display.HTML("<html>" + self.begin_debug + json_output + self.end_debug + "</html>"))


    logger = PGLogger(cumulative_mode=False,
    heap_primitives=False,
    show_only_outputs=False,
    finalizer_func=cgi_finalizer,
    disable_security_checks=True,
    allow_all_modules=True,
    probe_exprs=False)

    try:
    logger._runscript(cell)
    except bdb.BdbQuit:
    print("INTERNAL ERROR OCCURED")
    finally:
    logger.finalize()

    ## use ipython load_ext mechanism here if distributed
    get_ipython().register_magics(Helper)


    Helper files are stored in my GitHub repository for the ML course. I created them basing on GraphTerm ideas and sources from PyTutor repository. You can find some examples of usage in Lecture two "Python", but there's quite a lot of material, thus it may take some time to find them.

    Continue reading...

Compartilhe esta Página