You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:54:26