影刀RPA 流程配置化:把所有可变参数提到配置文件里
影刀RPA 流程配置化把所有可变参数提到配置文件里新手写的流程有个共同特征URL、账号、路径、阈值、超时时间全都硬编码在流程里。换个环境要改十几处漏改一处就崩。流程配置化就是把所有可能变的东西挪到配置文件里流程逻辑里只读配置不写死。哪些东西应该配置化不是所有东西都适合配置化。判断标准在不同的环境/时间点/场景下这个值会变吗必须配置化的配置项为什么示例URL测试环境和生产环境地址不同https://test.example.comvshttps://example.com账号密码不同环境不同账号且安全要求不能硬编码user_test/user_prod文件路径不同电脑路径不同C:\RPA_data\vsD:\RPA\超时时间网络状况不同时可能需要调整30秒 vs 60秒阈值业务规则可能调整“超过1万元” vs “超过5千元”开关功能模块启用/禁用“是否发送通知”重试次数稳定性策略调整3次 vs 5次可以硬编码的拼多多店群自动化上架方案内部变量名order_list这种纯粹的技术命名固定不变的业务规则极少大多数规则都会变一次性的调试代码配置文件格式选择格式优点缺点适用场景JSONPython原生支持结构清晰不能写注释机器读取为主的配置YAML可读性好支持注释需要装PyYAML需要人经常编辑的配置INI简单直观不支持嵌套结构非常简单的配置Excel非技术人员也能编辑需要openpyxl运营人员维护的配置推荐JSON。理由Python内置支持不需要额外安装库。结构灵活数组、嵌套对象都支持。如果配置需要非技术人员维护用Excel。JSON配置实战配置文件示例{_comment:订单同步流程配置 v1.2 — 2026-07-01,env:{name:PROD,log_level:INFO},browser:{headless:false,window_width:1366,window_height:768},timeout:{element_wait:30,page_load:60,api_request:15},urls:{login:https://erp.example.com/login,order_list:https://erp.example.com/orders?status待处理,api_base:https://api.example.com/v1},credentials:{username:${ENV:ERP_USERNAME},password:${ENV:ERP_PASSWORD}},business:{max_orders_per_run:500,amount_threshold:10000,date_range_days:1,platforms:[淘宝,京东,拼多多]},notification:{enabled:true,email_to:[bosscompany.com],on_success:false,on_failure:true,on_partial:true},retry:{max_attempts:3,delay_seconds:30,backoff_multiplier:2}}加载配置importjsonimportosdefload_config(config_pathNone):ifconfig_pathisNone:# 默认路径流程文件同目录下的config文件夹config_pathos.path.join(os.path.dirname(__file__),config/settings.json)withopen(config_path,r,encodingutf-8)asf:configjson.load(f)# 处理环境变量占位符configresolve_env_vars(config)returnconfigdefresolve_env_vars(obj):递归替换 ${ENV:VAR_NAME} 为实际环境变量值ifisinstance(obj,str):ifobj.startswith(${ENV:)andobj.endswith(}):var_nameobj[6:-1]returnos.environ.get(var_name,)returnobjelifisinstance(obj,dict):return{k:resolve_env_vars(v)fork,vinobj.items()}elifisinstance(obj,list):return[resolve_env_vars(item)foriteminobj]returnobj多环境配置切换importjsonimportosdefload_env_config(envNone):根据环境变量加载对应配置ifenvisNone:envos.environ.get(RPA_ENV,TEST)# 先加载基础配置base_pathconfig/settings.jsonwithopen(base_path,r,encodingutf-8)asf:configjson.load(f)# 再加载环境特定配置覆盖基础配置env_pathfconfig/settings.{env.lower()}.jsonifos.path.exists(env_path):withopen(env_path,r,encodingutf-8)asf:env_configjson.load(f)# 深度合并环境配置覆盖基础配置deep_merge(config,env_config)returnconfigdefdeep_merge(base,override):forkey,valueinoverride.items():ifkeyinbaseandisinstance(base[key],dict)andisinstance(value,dict):deep_merge(base[key],value)else:base[key]value使用方式通过环境变量RPA_ENV控制加载哪个配置。开发环境RPA_ENVTEST → 加载 settings.json settings.test.json 生产环境RPA_ENVPROD → 加载 settings.json settings.prod.json [video(video-giuBzUr6-1784483118045)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营)]settings.json放公共配置settings.prod.json只覆盖跟测试环境不同的部分主要是URL和账号。配置验证加载配置后立刻验证避免跑到一半才发现配置不对defvalidate_config(config):验证必要配置项是否存在errors[]# 检查必要字段required[(urls.login,config.get(urls,{}).get(login)),(credentials.username,config.get(credentials,{}).get(username)),(credentials.password,config.get(credentials,{}).get(password)),]forpath,valueinrequired:ifnotvalue:errors.append(f缺少必要配置{path})# 检查数值范围retryconfig.get(retry,{})ifretry.get(max_attempts,0)1:errors.append(retry.max_attempts 必须 1)iferrors:foreinerrors:print(f[配置错误]{e})returnFalsereturnTrue在影刀中读取配置驱动的流程主流程入口 1. Python节点 → 加载配置 config load_env_config() validate_config(config) 2. 从 config 中读取各项参数设置全局变量或传入子流程 login_url config[urls][login] max_retry config[retry][max_attempts] threshold config[business][amount_threshold] 3. 【打开网页】→ {login_url} 4. 【IF】登录失败: retry_count 0 WHILE retry_count {max_retry}: 重试登录... END WHILE 5. 执行采集使用 config 中的参数... 6. 【IF】config[notification][enabled]: 发送通知核心原则不要让你的流程代码里出现任何硬编码的URL、路径、账号、阈值。这些全部提到配置文件里。到了不同环境只改配置文件不动代码这是RPA工程化的基本素养。作者林焱