# -*- coding: utf-8 -*- """ builder.py - Handles the execution of the PyInstaller build process in a separate thread. """ import subprocess import threading import queue import os import traceback # For logging exceptions # NO CHANGES NEEDED in this file for the restructuring def run_build_in_thread(command, working_dir, output_queue, logger_func, output_dir_name, environment=None): """ Executes the PyInstaller command using subprocess.Popen in the background. ... (docstring remains the same) ... """ # ... (Function body remains the same as the previously translated version) ... build_process = None try: logger_func("Build thread starting execution...", level="INFO") env_log_msg = f"Using {'custom' if environment else 'inherited'} environment." if environment: pass logger_func(f"PyInstaller process starting. {env_log_msg}", level="INFO") build_process = subprocess.Popen( command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=working_dir, text=True, encoding='utf-8', errors='replace', bufsize=1, env=environment ) logger_func(f"PyInstaller process launched (PID: {build_process.pid}).", level="INFO") while True: try: line = build_process.stdout.readline() if not line: if build_process.poll() is not None: logger_func("End of PyInstaller output stream.", level="DEBUG") break else: pass else: output_queue.put(("LOG", line)) except Exception as read_err: logger_func(f"Error reading PyInstaller output stream: {read_err}\n{traceback.format_exc()}", level="ERROR") break return_code = build_process.wait() logger_func(f"PyInstaller process finished with exit code: {return_code}", level="INFO") if return_code == 0: dist_path_abs = os.path.join(working_dir, output_dir_name) if os.path.exists(dist_path_abs): success_msg = f"Build completed successfully!\nOutput Directory: {dist_path_abs}" output_queue.put(("BUILD_SUCCESS", success_msg)) else: warn_msg = (f"Build finished with exit code 0, but output directory not found:\n" f"{dist_path_abs}\nCheck the full log for potential issues.") logger_func(warn_msg, level="WARNING") output_queue.put(("BUILD_ERROR", warn_msg)) else: error_msg = f"Build failed! (Exit Code: {return_code})\nCheck the log for details." output_queue.put(("BUILD_ERROR", error_msg)) except FileNotFoundError: error_msg = ("Error: 'pyinstaller' command not found.\n" "Ensure PyInstaller is installed correctly and in the system PATH.") output_queue.put(("BUILD_ERROR", error_msg)) logger_func(error_msg, level="CRITICAL") except Exception as e: error_msg = f"Unexpected error during build process execution: {e}" output_queue.put(("BUILD_ERROR", error_msg)) logger_func(error_msg, level="CRITICAL") logger_func(traceback.format_exc(), level="DEBUG") finally: output_queue.put(("BUILD_FINISHED", None)) logger_func("Build thread finished.", level="INFO")