PyInstaller打包后ProcessPoolExecutor子进程重复执行main代码问题
PyInstaller打包后ProcessPoolExecutor子进程重复执行入口代码问题
问题现象
- 程序基础逻辑:启动时首先在命令行调用
getpass.getpass()提示用户输入密码,随后将获取到的密码值传入ProcessPoolExecutor调度的目标函数,执行多进程任务 - 正常环境表现:在IDE、命令行原生Python环境下运行逻辑完全正常,仅在程序启动时提示1次密码输入,存储后的密码值可正常传入每个新进程
- 打包后异常表现:使用PyInstaller打包为冻结Python程序运行时,进程池每次启动新进程都会重复触发密码输入提示;每个子进程都会加载执行全部顶层代码,甚至重复调用main函数
已尝试无效方案
已测试以下调整方式,均无法解决问题:
- 将
getpass()调用放在if __name__ == '__main__'代码块内 - 将
getpass()调用放在main函数内 - 将
getpass()调用放在main函数外
修复需求
找到可行的PyInstaller配置或代码调整方法,阻止ProcessPoolExecutor每次启动新进程时重复执行main函数内全部代码的异常,该异常仅在PyInstaller打包后的冻结环境中出现。
复现示例代码
import concurrent.futures import getpass from functools import partial def multi_process_function(user, password, iterable): # 执行具体任务逻辑 def main(): user = getpass.getuser() password = getpass.getpass('Please enter password') func = partial(multi_process_function, user, password) iterableThing = [1, 2, 3] output = {} with concurrent.futures.ProcessPoolExecutor as executor: results = executor.map(func, iterableThing) for result in results: output.update(result) if __name__ == '__main__': main()
异常运行输出示例

内容的提问来源于stack exchange,提问作者Rufom1
相关产品推荐
相关产品推荐

