影刀RPA 环境变量管理:读取与设置

📅 2026/7/21 6:54:36
影刀RPA 环境变量管理:读取与设置
影刀RPA 环境变量管理读取与设置作者林焱什么情况用你的影刀流程需要根据不同的电脑自动适配路径——在开发机上用D:/data在生产机上用E:/data你想让敏感信息密码、密钥不硬编码在流程中而是通过环境变量传入你需要调用其他程序但它的路径在不同电脑上不一样环境变量管理是让流程跨环境运行的基础。通过读取系统环境变量流程可以自动适配不同电脑的配置不需要每次换电脑都改代码。本文讲清楚怎么读取和设置环境变量、在影刀RPA中怎么用、怎么用环境变量管理敏感信息。怎么做一、读取环境变量importos# 基本读取 # 方式1os.environ字典方式db_hostos.environ.get(DB_HOST,localhost)# 不存在返回默认值python_pathos.environ.get(PYTHONPATH,)# 不存在返回空字符串# 方式2os.getenv()更简洁db_hostos.getenv(DB_HOST,localhost)api_keyos.getenv(API_KEY,)# 方式3直接索引不存在会报KeyErrortry:db_hostos.environ[DB_HOST]exceptKeyError:db_hostlocalhost# 读取常用系统环境变量 # 系统相关[video(video-7LmDT5KF-1784577931506)(type-csdn)(url-https://live.csdn.net/v/embed/525010)(image-https://v-blog.csdnimg.cn/asset/f4faa587144cb7070f19e8b36813806b/cover/Cover0.jpg)(title-店群矩阵自动化突破运营极限)]computer_nameos.environ.get(COMPUTERNAME,)# 电脑名usernameos.environ.get(USERNAME,)# 用户名user_profileos.environ.get(USERPROFILE,)# 用户目录temp_diros.environ.get(TEMP,)# 临时目录app_dataos.environ.get(APPDATA,)# AppData目录program_filesos.environ.get(PROGRAMFILES,)# Program Files目录# 路径相关pathos.environ.get(PATH,)# 系统PATHhomeos.environ.get(HOMEPATH,)# Home路径windiros.environ.get(WINDIR,)# Windows目录print(f电脑名:{computer_name})print(f用户名:{username})print(f临时目录:{temp_dir})print(f用户目录:{user_profile})二、设置环境变量importos# 在Python进程中设置仅当前进程有效 os.environ[RPA_CONFIG_PATH]D:/configos.environ[RPA_ENV]productionos.environ[RPA_DEBUG]true# 设置后可以在当前进程的任何地方读取print(os.getenv(RPA_CONFIG_PATH))# D:/config# 注意Python中设置的环境变量只在当前进程有效 # 不会影响系统环境变量# 子进程会继承当前进程的环境变量# 进程结束后环境变量消失# 启动子进程时传递环境变量 importsubprocess# 子进程会继承父进程的环境变量resultsubprocess.run([python,script.py],envos.environ# 传递当前环境变量默认行为)# 自定义子进程的环境变量custom_envos.environ.copy()custom_env[CUSTOM_VAR]custom_valueresultsubprocess.run([python,script.py],envcustom_env)三、永久设置系统环境变量importsubprocessimportctypesimportosdefset_system_env_variable(name,value,scopeuser): 永久设置系统环境变量 scope: user用户级, system系统级需要管理员权限 ifscopeuser:# 用户级环境变量不需要管理员权限# 通过注册表设置importwinreg keywinreg.OpenKey(winreg.HKEY_CURRENT_USER,Environment,0,winreg.KEY_SET_VALUE)winreg.SetValueEx(key,name,0,winreg.REG_EXPAND_SZ,value)winreg.CloseKey(key)elifscopesystem:# 系统级环境变量需要管理员权限importwinreg keywinreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,rSYSTEM\CurrentControlSet\Control\Session Manager\Environment,0,winreg.KEY_SET_VALUE)winreg.SetValueEx(key,name,0,winreg.REG_EXPAND_SZ,value)winreg.CloseKey(key)# 通知系统环境变量已更改让其他程序能感知到# 发送WM_SETTINGCHANGE消息HWND_BROADCAST0xFFFFWM_SETTINGCHANGE0x001Aresctypes.c_long()ctypes.windll.user32.SendMessageTimeoutW(HWND_BROADCAST,WM_SETTINGCHANGE,0,Environment,0x0002,# SMTO_ABORTIFHUNG5000,ctypes.byref(res))print(f已设置环境变量{name}{value}{scope}级)# 使用set_system_env_variable(RPA_DATA_DIR,D:/rpa_data,scopeuser)四、环境变量管理敏感信息importosclassEnvConfig:基于环境变量的配置管理# 配置项定义key → (环境变量名, 默认值, 转换函数)CONFIG_ITEMS{db_host:(DB_HOST,localhost,str),db_port:(DB_PORT,3306,int),db_name:(DB_NAME,rpa_db,str),db_user:(DB_USER,root,str),db_password:(DB_PASSWORD,,str),# 敏感信息api_key:(API_KEY,,str),# 敏感信息api_secret:(API_SECRET,,str),# 敏感信息max_pages:(MAX_PAGES,10,int),timeout:(TIMEOUT,30,int),retry_count:(RETRY_COUNT,3,int),debug:(DEBUG,false,lambdax:x.lower()true),output_dir:(OUTPUT_DIR,D:/output,str),}classmethoddefget(cls,key):获取配置值ifkeynotincls.CONFIG_ITEMS:raiseKeyError(f未知配置项:{key})env_name,default,convertercls.CONFIG_ITEMS[key]raw_valueos.environ.get(env_name,str(default))try:returnconverter(raw_value)except(ValueError,TypeError):returnconverter(default)classmethoddefget_all(cls):获取所有配置return{key:cls.get(key)forkeyincls.CONFIG_ITEMS}classmethoddefvalidate(cls):验证必填配置missing[]forkey,(env_name,default,_)incls.CONFIG_ITEMS.items():ifdefaultandnotos.environ.get(env_name):missing.append(env_name)ifmissing:print(以下环境变量未设置)fornameinmissing:print(f -{name})returnFalsereturnTrue# 使用configEnvConfig# 读取配置db_hostconfig.get(db_host)db_portconfig.get(db_port)db_passwordconfig.get(db_password)max_pagesconfig.get(max_pages)debugconfig.get(debug)# 验证必填项ifconfig.validate():print(配置验证通过)else:print(配置不完整请设置环境变量)五、自动适配不同电脑importosimportsocketclassPathManager:自动适配不同电脑的路径管理def__init__(self):self.computer_nameos.environ.get(COMPUTERNAME,socket.gethostname())self.usernameos.environ.get(USERNAME,)# 根据电脑名设置不同的路径配置self.COMPUTER_CONFIGS{DESKTOP-DEV:{data_dir:D:/data,output_dir:D:/output,log_dir:D:/logs,temp_dir:D:/temp,},SERVER-PROD:{data_dir:E:/rpa/data,output_dir:E:/rpa/output,log_dir:E:/rpa/logs,temp_dir:C:/temp,},}# 默认配置self.default_config{data_dir:os.path.join(os.environ.get(USERPROFILE,),data),output_dir:os.path.join(os.environ.get(USERPROFILE,),output),log_dir:os.path.join(os.environ.get(USERPROFILE,),logs),temp_dir:os.environ.get(TEMP,C:/temp),}defget_path(self,key):获取路径# 优先级环境变量 电脑特定配置 默认配置env_keyfRPA_{key.upper()}# 1. 环境变量env_valueos.environ.get(env_key)ifenv_value:returnenv_value# 2. 电脑特定配置ifself.computer_nameinself.COMPUTER_CONFIGS:ifkeyinself.COMPUTER_CONFIGS[self.computer_name]:returnself.COMPUTER_CONFIGS[self.computer_name][key]# 3. 默认配置returnself.default_config.get(key,)defensure_dirs(self):确保所有目录存在forkeyin[data_dir,output_dir,log_dir,temp_dir]:pathself.get_path(key)ifpath:os.makedirs(path,exist_okTrue)print(f目录就绪:{key}{path})# 使用pmPathManager()pm.ensure_dirs()data_dirpm.get_path(data_dir)output_dirpm.get_path(output_dir)print(f数据目录:{data_dir})print(f输出目录:{output_dir})六、在影刀RPA中使用环境变量影刀流程中可以用以下方式使用环境变量 1. 在【执行Python代码】中用os.environ读取 2. 在影刀的表达式中用 %RPA_DATA_DIR% 引用如果影刀支持 3. 在影刀的变量管理中创建环境变量类型的变量 4. 通过配置文件间接使用# 在影刀Python代码块中的实际使用# 1. 读取配置路径config_pathos.environ.get(RPA_CONFIG_PATH,config.json)# 2. 读取数据库密码不硬编码在流程中db_passwordos.environ.get(RPA_DB_PASSWORD,)ifnotdb_password:print(警告未设置RPA_DB_PASSWORD环境变量)# 3. 根据环境变量决定运行模式debug_modeos.environ.get(RPA_DEBUG,false).lower()trueifdebug_mode:print( 调试模式 )# 4. 写入影刀变量供后续指令使用yd_var[data_dir]os.environ.get(RPA_DATA_DIR,D:/data)yd_var[output_dir]os.environ.get(RPA_OUTPUT_DIR,D:/output)yd_var[debug_mode]debug_mode有什么坑坑1Python设置的环境变量不会永久生效现象用os.environ[VAR] value设置了环境变量但在CMD或影刀的其他流程中读不到。原因os.environ设置的环境变量只在当前Python进程及其子进程中有效。进程结束后就消失了。不会写入系统环境变量。解决如果需要永久设置用注册表方式见上文set_system_env_variable函数。如果只是在当前流程中使用os.environ就够了。坑2环境变量名大小写问题现象在Windows上os.environ[PATH]和os.environ[path]都能读到但在Linux上只有大写PATH才行。原因Windows环境变量不区分大小写Linux/Mac区分大小写。temu店群自动化报活动案例解决环境变量名统一用大写。使用os.environ.get(VAR_NAME)时Windows上大小写都行但为了跨平台兼容统一用大写。坑3PATH环境变量修改后不立即生效现象在Python中修改了PATH环境变量但subprocess.run([program])还是找不到程序。原因修改os.environ[PATH]后Python进程的PATH确实变了但有些程序的查找依赖系统级PATH缓存。解决修改PATH后用完整路径调用程序或者在子进程中显式设置env参数。修改PATH后可能需要新建子进程才能生效。坑4环境变量中包含特殊字符现象环境变量值中包含%、$、;等特殊字符读取时被解析或截断。原因Windows环境变量中%VAR%会被展开分号;是PATH的分隔符。解决如果值中需要包含特殊字符用注册表设置时用REG_EXPAND_SZ类型避免展开。读取后做适当处理。路径中避免使用特殊字符。坑5影刀流程运行时环境变量和手动运行不一致现象在CMD中设置了环境变量但影刀流程运行时读不到。原因影刀可能是作为Windows服务运行的服务运行的环境变量和用户登录后的环境变量可能不同。解决通过系统环境变量注册表方式设置确保所有进程都能读到。或者在影刀流程启动时先运行一个初始化脚本设置需要的环境变量。检查影刀是以服务方式运行还是以用户方式运行对应的环境变量来源不同。