import pandas as pd import traceback def load_excel(file): df = pd.read_excel(file) return file, df def run_code(file, code): scope = {'pd': pd} if file: print('file ok') df = pd.read_excel(file) scope['df'] = df try: # Attempt to execute the user's code exec(code, scope, scope) except Exception as e: # Catch any exceptions that occur and print the error message error_msg = traceback.format_exc() print(f"Error executing user code: {error_msg}") scope['new_df'] = df # Use the original df if error occurs return scope['new_df'], error_msg # Return the error message along with the df print(scope.keys()) if 'new_df' not in scope: print("new_df not defined") scope['new_df'] = df.copy() new_df = scope['new_df'] return new_df, None # Return None as the error message when execution is successful else: print("No file provided") return pd.DataFrame(), "No file provided" def run_code_and_update_ui(file, code): df, error_msg = run_code(file, code) # This is your updated run_code function. # Now, check if there's an error message and handle it appropriately. if error_msg: # You can update some error display component in Gradio here to show the error_msg. # Assuming you have a gr.Textbox to display errors: error_display.update(value=f"Error in code execution: {error_msg}") # Ensure you still return the original DataFrame or an empty one to satisfy the expected output type. return df else: # If no error, clear the error display and return the DataFrame as usual. error_display.update(value="") return df def export_df(df, filename): filename = filename.replace('.xlsx', '_coded.xlsx') df.to_excel(filename, index=False) return filename