PyCharm正常运行的代码经PyInstaller打包为exe后无限循环崩溃
核心原因
Windows下multiprocessing采用spawn模式启动子进程,会重新导入整个脚本。如果你的主程序逻辑(比如创建进程池、调用load_documents的代码)没放在if __name__ == '__main__':块里,子进程启动时会重复执行这些逻辑,无限创建新的进程池,最终导致循环崩溃,同时重复输出主逻辑里的日志(比如"Creating new vectorstore")。另外,PyInstaller打包多进程程序时,缺少freeze_support()调用也会导致进程初始化异常,间接引发循环问题。
解决步骤
用
if __name__ == '__main__':包裹所有主逻辑
把启动程序的代码(比如初始化进程池、调用load_documents、创建vectorstore的逻辑)全部放到这个判断块里,确保只有主进程会执行这些代码,子进程导入脚本时只会加载函数定义,不会重复执行主逻辑。示例:import multiprocessing def load_single_document(file): # 你的文件处理逻辑 pass def load_documents(filtered_files): with multiprocessing.Pool() as pool: for i, docs in enumerate(pool.imap_unordered(load_single_document, filtered_files)): # 后续处理逻辑 pass if __name__ == '__main__': multiprocessing.freeze_support() filtered_files = ["file1.txt", "file2.txt"] load_documents(filtered_files)添加
freeze_support()调用
在if __name__ == '__main__':的第一行加上multiprocessing.freeze_support(),这是PyInstaller打包Windows多进程程序的必备操作,用来处理打包后的进程启动流程。确保子进程能访问目标函数
load_single_document等被进程池调用的函数必须定义在全局作用域(不能放在if __name__ == '__main__':块里),否则子进程无法导入这些函数,会导致任务执行失败,甚至触发主进程重复提交任务的情况。检查第三方依赖打包情况
如果用到langchain这类第三方库,打包时用--collect-all langchain这类参数强制收集所有依赖,避免子进程因缺少依赖崩溃,进而引发循环。
内容的提问来源于stack exchange,提问作者Haski

