Функция трассировки не работает должным образом с импортированными файлами - PullRequest
2 голосов
/ 19 июня 2020

В настоящее время я работаю над программой, которая отображает переменные строка за строкой, когда код выполняется из файла (подумайте о таблицах трассировки). Я могу заставить его работать нормально, когда код заключен в функцию внутри самой программы, но когда я импортирую тот же код, он отслеживает новые переменные, которые я не хочу отслеживать (поскольку они не отображаются в актуальный сценарий). Есть ли способ изолировать переменные, указанные c в программе? (это также будет полезно, когда я игнорирую переменные из извлеченных библиотек в Python).

Вот моя программа на данный момент:

import sys
import dis 
from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog

line_record = [] #where data on variables will be stored line by line
def trace(frame, event, arg_unused): #tracing function
    global line_record
    relevant_locals = {}
    temp_vars = frame.f_locals.copy()
    for k,v in temp_vars.items():
          if not k.startswith("__"):
              relevant_locals[k] = v
    line_record.append([frame.f_lineno, relevant_locals])
    return trace

def print_results(v_list):
    print_record="" #variable which holds the formatting of the data
    for item in v_list: #iterating for data in each recorded line
        print_record += "Line " + str(item[0]) + "= "
        if item[1]=={}: #catching lines with no variables
            print_record += "no variables"
        else:
            for key in item[1]: #iterating through each variable to fetch associated data
                print_record += str(key)+"="+str(item[1].get(key,"error"))+"|"
        print_record += "\n"
    return print_record


root = Tk() #creating the main window
root.title("frame")
root.iconbitmap("c:/Users/hamza/Documents/Other/Python/GUI/6 images/apple.ico")

root.filename = filedialog.askopenfilename(initialdir="/", title="select file",filetypes=[("python files","*.py")]) #import python files through tkinter dialog box
user_code = compile(open(root.filename, "rb").read(), root.filename, 'exec') #compiling imported code in order to use later in project

sys.settrace(trace)
exec(user_code)
sys.settrace(None)
print(print_results(line_record))

root.mainloop()

И для справки (при необходимости ), мой тестовый код:

a = 1
b = 2

a = a + b

Если вам нужна дополнительная информация, не стесняйтесь спрашивать, я рад уточнить, спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...