pyinstaller打包之后的windows程序无法正常运行多进程(multiprocessing与argparse)
一、windows环境下无法共享全局变量的值
同样的代码分别在linux环境以及windows环境有很大区别
代码片段:
# new_list,list_success_table是全局变量
print('task id:',task_id,'list_success_table:',list_success_table,'new_list:',new_list)
Linux环境正常输出全局变量list_success_table,new_list:
Windows环境运行无法获取到全局变量:
解决方法:
使用传参的方式传递变量值,例如:
process = multiprocessing.Process(target=mig_table_task_total, args=(p_id,new_list[0][p_id]))
原先只有p_id这一个输入参数,现增加new_list[0][p_id]),本例为list类型为输入参数
二、使用argparse命令行工具以及multiprocessing运行可执行文件报错
报错如下:
参数error: unrecognized arguments: --multiprocessing-fork parent_pid=37636 pipe_handle=1128
原因:
windows环境打包之后的可执行文件,在运行的时候会隐式生成命令行选项--multiprocessing-fork
,会在运行多进程方法报错,然而在Linux环境运行一点问题没有。
解决方法:
需要改2个地方
1、 命令行参数方面修改
原参数是这么写的
parser.add_argument('--quite_mode', '-q', help='quite mode mig', action='store_true',
default='false')
parser.add_argument('-v', '--version', action='version', version=version + release_date, help='Display version')
args = parser.parse_args()
改为如下:
parser.add_argument('--quite_mode', '-q', help='quite mode mig', action='store_true',
default='false')
parser.add_argument('-v', '--version', action='version', version=version + release_date, help='Display version')
args, unparsed = parser.parse_known_args()
# parse_known_args.只解析正确的参数列表,无效参数会被忽略且不报错,args是解析正确参数,unparsed是不被解析的错误参数,win多进程需要此写法
2、另外需要在main函数下方使用freeze_support()
if __name__ == '__main__':
multiprocessing.freeze_support()
不然会一直从头循环运行本程序