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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03