В настоящее время я работаю над программой, которая отображает переменные строка за строкой, когда код выполняется из файла (подумайте о таблицах трассировки). Я могу заставить его работать нормально, когда код заключен в функцию внутри самой программы, но когда я импортирую тот же код, он отслеживает новые переменные, которые я не хочу отслеживать (поскольку они не отображаются в актуальный сценарий). Есть ли способ изолировать переменные, указанные 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
Если вам нужна дополнительная информация, не стесняйтесь спрашивать, я рад уточнить, спасибо.