使用PyInstaller打包多进程CPU压力测试脚本遇ValueError错误求助
解决PyInstaller打包multiprocessing脚本后报错"invalid literal for int() with base 10: 'parent_pid=xxx'"
这个错误的核心原因是PyInstaller打包后,启动子进程时会自动添加parent_pid=xxx这类额外命令行参数,而你的脚本在解析sys.argv时没过滤这些参数,把它们当成了自己的输入去转成整数,导致报错。
以下是具体解决方案:
过滤PyInstaller添加的额外参数
找到脚本里处理sys.argv的代码(就是报错的第38行附近),先过滤掉以parent_pid=开头的参数,再进行解析。比如:import sys # 过滤掉PyInstaller自动添加的参数 clean_args = [arg for arg in sys.argv if not arg.startswith('parent_pid=')] # 用clean_args替代原来的sys.argv进行后续解析 # 比如原来的int(sys.argv[1])改成int(clean_args[1])(注意索引对应)确保freeze_support()放在最前面
把multiprocessing.freeze_support()放在脚本最开头,在任何multiprocessing相关代码(包括导入子模块、定义进程函数)之前:import multiprocessing multiprocessing.freeze_support() # 下面才是你的其他代码:导入模块、定义压力测试函数、启动进程等避免子进程依赖sys.argv解析
如果你的子进程入口函数里也在解析sys.argv,同样要做参数过滤,或者直接把需要的参数通过Process的args参数传递,而不是依赖命令行参数:def stress_test(core_num): # 这里直接用传入的core_num,不用从sys.argv取 ... # 启动进程时直接传参数 p = multiprocessing.Process(target=stress_test, args=(4,)) p.start()尝试禁用UPX压缩
有些情况下UPX压缩会干扰multiprocessing的参数传递,打包时添加--noupx参数:pyinstaller --noconfirm --onefile --console --noupx "...FolderName/stress_test_manager.py"
先检查第38行的代码,确认是哪一行在转整数,然后对应调整参数解析逻辑,基本就能解决问题。
内容的提问来源于stack exchange,提问作者kurdish sage
相关产品推荐
相关产品推荐

