如何使用map对pandas DataFrame做多进程处理并传递多个参数
错误原因
- 你调用
Pool.map时传入的是两个完整的Series对象,而非按行拆分的单条数据,函数接收到的参数是整个序列,自然触发「期望字符串/路径,实际是Series」的类型错误 - 标准的
Pool.map仅支持传递单参数可迭代对象,多参数传递需要使用Pool.starmap方法,它会自动将可迭代对象中的每个元组拆包为函数的入参 - 你写的参数列表还存在语法错误,括号未配对,且ffmpeg命令参数的解包逻辑也不对,会导致输入输出参数混乱
修复后可运行代码
import pandas as pd import multiprocessing as mp import subprocess def ffmpeg_function(stream_url, camera_name): # 输出文件路径用name字段命名 output_path = f'/home/test/{camera_name}.mp4' subprocess.run( ["/usr/bin/ffmpeg", "-y", "-t", "10", "-i", stream_url, output_path], capture_output=True ) # 可按需返回执行状态,这里返回输出路径做记录 return output_path if __name__ == '__main__': # 读取csv配置 camera_df = pd.read_csv('/home/test/streams.csv', low_memory=False) # 按行打包参数为 (url, name) 元组的列表 params = list(camera_df[['url', 'name']].itertuples(index=False, name=None)) # 启动多进程处理 with mp.Pool(mp.cpu_count()) as p: # starmap自动拆包每个元组给函数的两个入参 camera_df['output_path'] = p.starmap(ffmpeg_function, params)
核心修改说明
- 用
itertuples把DataFrame的每行url和name打包成元组,确保每个参数对应当前行的单条数据,而非整个序列 - 改用
starmap替代map处理多参数传递,自动完成元组拆包 - 函数明确接收两个参数:流地址和摄像头名,输出路径直接用摄像头名拼接,避免参数解包混乱
- 加了
if __name__ == '__main__'保护,这是多进程运行的必备要求,避免进程无限递归启动 - 用上下文管理器
with管理Pool,自动完成资源释放,不需要手动写close和join
内容的提问来源于stack exchange,提问作者D0n
相关产品推荐
相关产品推荐

