1。背景 最近接到一个产品需求是给指定的sftp服务器的指定目录定时推送文件数据。 因为项目组已有现成的组件可以轻松实现sftp服务器文件的快速上传,本来是一件很容易的事情,但是问题出现在这个指定的sftp服务器所指定的密码带有系统关键字和一些特殊字符,导致现在的组件在解析过程中会失败。 因此重新开发了下面的这套脚本来满足这个特殊的需求。 2。代码实现 Python代码testupload。pyimportos,sysimportyamlfromoptparseimportOptionParserimportparamikoimporttracebackoptparserOptionParser()optparser。addoption(node,actionstore,typestring,destnode,helpsftpconfig)optparser。addoption(localfile,actionstore,typestring,destlocalfile,helpfiletobetransferred)defloadconfigfromparamconf(key)::paramkey:指定业务所使用的sftp服务的名称,例如sftp。yaml文件中的key:testfileupload:return:从指定路径拿到yaml文件并读取指定key,返回例如sftp。yaml文件中key为testfileupload下的配置选项值包含:host,port,user,password,destinationconfigfilef{os。environ〔TASKMAIN〕}testconfsftp。yaml获取指定路径下的yaml文件withopen(configfile,r)asr:打开yaml文件内容configyaml。load(r)转换yaml数据为字典returnconfig〔sftp〕〔upload〕〔key〕defupload(sftpconf,localfilepath)::paramsftpconf:获取指定sftpconftestfileupload下返回的字典值,这里的参数sftpconf与loadconfigfromparamconf函数里的参数值一致:paramlocalfilepath:指定本地要上传到sftp服务器的文件的绝对路径:return:sfparamiko。Transport((sftpconf〔host〕,sftpconf〔port〕))sf。connect(usernamesftpconf〔user〕,passwordsftpconf〔password〕)sftpparamiko。SFTPClient。fromtransport(sf)topathsftpconf〔destination〕sftp。put(localfilepath,topathos。sepos。path。split(localfilepath)〔1〕,confirmFalse)sftp。close()ifnamemain:optionoptparser。parseargs(sys。argv〔1:〕)〔0〕sftpconfloadconfigfromparamconf(option。node)try:upload(sftpconf,option。localfile)exceptExceptionase:print(traceback。formatexc())raiseException(upload{}fileerror。。format(option。localfile)) sftp配置文件代码sftp。yamlsftp:upload:testfileupload:host:10。12。34。6port:808user:usertestpassword:8Z。Lx2UHdestination:datadump 3。代码分析 (1)。yaml模块importyaml 导入yaml模块前可以使用以下命令进行模块的安装python3mpipinstallPyYaml yaml模块在这里的作用是读取sftp配置文件代码,将指定key:testfileupload下的key:value的值转换为字典。 例如:loadconfigfromparamconf函数中的返回值就是使用yaml读取到sftp配置文件代码后,返回key:testfileupload下配置选项值。 格式如下:{host:10。12。34。6,port:808,user:usertest,password:8Z。Lx2UH,destination:datadump} 最后将返回值传给upload函数作为参数。 (2)。OptionParser模块fromoptparseimportOptionParser 按照yaml模块的安装方法,先安装optparse模块后,然后在文件中从optparse中导入OptionParser模块optparserOptionParser()optparser。addoption(node,actionstore,typestring,destnode,helpsftpconfig)optparser。addoption(localfile,actionstore,typestring,destlocalfile,helpfiletobeuploaded) 在这里我使用了OptionParser这个类实例化了一个对象:optparser,通过对象来调用addoption方法添加了2个参数,分别是:node,localfile 1)。形参:node,实参:node 所代表的业务含义是:指定要上传的sftp的节点,具体参数值对应sftp配置文件代码中的testfileupload 2)。形参:localfile,实参:localfile 所代表的业务含义是:指定本地需要被上传到sftp服务器的具体文件路径 3)。调用命令python3testupload。pynodetestfileuploadlocalfilehometestsftploadtest001。csv 4)。addoption()方法addoption()参数说明:action:存储方式,分别为:store,storefalse,storetruetype:类型dest:存储的变量default:默认值help:帮助信息 参数:action的枚举 store:参数列表中带有node,那么就会将下一个元素即:testfileupload作为其dest实参node的值;如果没有node,那么对应的node的值就为None; storetrue:参数列表中有localfile,那么其dest实参localfile的值就为True;否者就为default定义的默认值,这里没有给定default的默认值; storefalse:参数列表中有localfile,那么其dest实参localfile的值就为False;否者就为default定义的默认值,这里没有给定default的默认值; 参数:type type是指定传入参数的类型,这里的参数类型为string类型。 参数:dest dest是参数传入后由哪个变量来存储的,后面代码对该参数的引用也是使用这里定义的变量名来引用的。 参数:default default是与action的值结合使用的。当actionstoretrue时,default123时,如果有传入形参localfile,则实参localfile的值为:True当actionstoretrue时,default123时,如果没有传入形参localfile,则实参localfile的值为:123当actionstorefalse时,default123时,如果有传入形参localfile,则实参localfile的值为:False当actionstorefalse时,default123时,如果没有传入形参localfile,则实参localfile的值为:123 参数:help help相当于帮助说明文档,用于描述这个参数的含义。