python 从共享文件中自动拷贝指定文件到本地【续】
2013-11-27 14:29
260 查看
前几天写过一篇文章:python 从共享文件中自动拷贝指定文件到本地
今天把它完善一下,整个代码分为4块:测试代码脚本、命令行脚本、copy 功能脚本以及辅助工具脚本。
【备注:我是用的是python2.7,由于python3.x与2.x有很多地方不同,所以不要尝试在3.x上,以免出现未知错误】
首先是测试脚本:
在这里,由于是拷贝脚本的编写,必然涉及到源文件以及目标文件,那么先从源文件入手,想获得共享文件,首先得有一个共享文件所在服务器的ip地址,然后有一个已知源文件路径这样就有了srcFilename了,至于目标路径,随便设定。代码:
test.py:
接下来是MyCommand模块,这个模块是使用subprocess.Popen创建命令行线程向copy那个自定义的脚本传参,这个模块为什么会有呢?为什么不使用copy直接拷贝呢?因为当考虑的时候,应该考虑共享文件不可访问或者路径不存在这种情况,那么如何识别不能顺利获取到想要的文件呢?开始的时候想用ping 命令判断是否可以访问到,但是实际做的时候发现,服务器那边可能将ping 功能关闭,这样当可以访问的时候,也会出现ping 不通的可能。后来想到,如果可以顺利找到共享文件那么就可以获得,之后使用os.path.exists()找的时候发现,如果找得到的时候,会瞬间找到,即使不能很快,至少3秒也应该能够找到了。但是如果不能找到,这个函数会阻塞,一直在那尝试找,直到达到了函数默认的timeout(大约是10秒以上)才会停止查找,但是我们不希望那样让它一直在那“傻傻的”找,而想自己定时,以至于我们可以根据具体情况设置一下界限,当限制时间内还没有找到共享文件那么就判断是不可访问,则立刻停止搜索,也就是将搜索所在的脚本kill掉(之前一直找如何控制函数运行时间,超时就kill,但是找到如何控制时间了,但是同一个线程中,感觉没办法kill一个函数,所以但提出来使用了这个方法),用户体验也就提升了,好了,贴代码:
Mycommand.py:
里边依然存在一些没哟考虑到的地方,希望朋友们发现了说一下啊
今天把它完善一下,整个代码分为4块:测试代码脚本、命令行脚本、copy 功能脚本以及辅助工具脚本。
【备注:我是用的是python2.7,由于python3.x与2.x有很多地方不同,所以不要尝试在3.x上,以免出现未知错误】
首先是测试脚本:
在这里,由于是拷贝脚本的编写,必然涉及到源文件以及目标文件,那么先从源文件入手,想获得共享文件,首先得有一个共享文件所在服务器的ip地址,然后有一个已知源文件路径这样就有了srcFilename了,至于目标路径,随便设定。代码:
test.py:
import os , sys , Mycommand def main(): hostIp = '192.168.0.111' sharePath = '\\path' filename = 'file_testname' resultStr = [] resultStr.append([]) srcFilename = '\\\\' + hostIp + sharePath + '\\' + filename desFilename = 'd:\\ftp\\ftp_download' cmd = [ 'C:\\python27\\python.exe', 'C:\\Users\\admin\\Desktop\\copy\\copyShareFile.py', srcFilename, desFilename ] res = Mycommand.command(resultStr , cmd , 3) if res == True: print ('download success!') else : print ('download failed!') if __name__ == '__main__': main()
接下来是MyCommand模块,这个模块是使用subprocess.Popen创建命令行线程向copy那个自定义的脚本传参,这个模块为什么会有呢?为什么不使用copy直接拷贝呢?因为当考虑的时候,应该考虑共享文件不可访问或者路径不存在这种情况,那么如何识别不能顺利获取到想要的文件呢?开始的时候想用ping 命令判断是否可以访问到,但是实际做的时候发现,服务器那边可能将ping 功能关闭,这样当可以访问的时候,也会出现ping 不通的可能。后来想到,如果可以顺利找到共享文件那么就可以获得,之后使用os.path.exists()找的时候发现,如果找得到的时候,会瞬间找到,即使不能很快,至少3秒也应该能够找到了。但是如果不能找到,这个函数会阻塞,一直在那尝试找,直到达到了函数默认的timeout(大约是10秒以上)才会停止查找,但是我们不希望那样让它一直在那“傻傻的”找,而想自己定时,以至于我们可以根据具体情况设置一下界限,当限制时间内还没有找到共享文件那么就判断是不可访问,则立刻停止搜索,也就是将搜索所在的脚本kill掉(之前一直找如何控制函数运行时间,超时就kill,但是找到如何控制时间了,但是同一个线程中,感觉没办法kill一个函数,所以但提出来使用了这个方法),用户体验也就提升了,好了,贴代码:
Mycommand.py:
import sys , time , subprocess class TimeoutError(Exception): pass def command(resultStr , cmd , timeout = 20): print ('command start...') process = subprocess.Popen(cmd , stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell = True) beginTime = time.time() secondsPass = 0 while True: if process.poll() is not None: break secondsPass = time.time() - beginTime if timeout and timeout < secondsPass: process.terminate() print ('running timeout!') return False #raise TimeoutError(cmd , timeout) time.sleep(0.1) if len(resultStr) > 0: resultStr[0] = process.stdout.read() return True最后是比较常规的拷贝代码:
# -*- coding: cp936 -*- import sys , os , re def copyFileDir(srcFilename , desFilename): status = False try: fileList = os.listdir(srcFilename) for eachFile in fileList: sourceF = os.path.join(srcFilename,eachFile) targetF = os.path.join(desFilename,eachFile) if os.path.isdir(sourceF): if not os.path.exists(targetF): os.makedir(targetF) status = copyFileDir(sourceF,targetF) else : status = copyFile(sourceF,targetF) except Exception,e: print (e) status = False finally: print ('copyFileDir function is quit!') return status def copyFile(srcFilename , desFilename): status = False copyCommand = 'copy %s %s'%(srcFilename,desFilename) try: if(os.popen(copyCommand)): #不用op.system(copyCommand),因为这个会弹出命令行界面 print ('copy done!') status = True else : print ('copy failed!') status = False except Exception,e: print (e) status = False finally: print ('copyFile function is quit!') return status def copyFromSharePath(srcFilename,desFilename): if not os.path.exists(srcFilename): print ('no found '+srcFilename) return False if not os.path.exists(desFilename): print ('no found '+desFilename) os.makedirs(str(desFilename)) print ('create '+desFilename) copyStatus = False if os.path.isdir(srcFilename): copyStatus = copyFileDir(srcFilename,desFilename) else : copyStatus = copyFile(srcFilename,desFilename) return copyStatus def main(argv = sys.argv): if not len(argv) == 3: print ('input parameters\'s count should be 3,not %s'%(len(argv))) return print ('脚本名字是:' + argv[0]) srcFilename = argv[1] print ('源目录:' + argv[1]) desFilename = argv[2] print ('目标目录:' + argv[2]) if os.path.isdir(srcFilename): if os.path.isfile(desFilename): print ('can not copy a folder to a file') return copyFromSharePath(srcFilename,desFilename) if __name__=='__main__': main()
里边依然存在一些没哟考虑到的地方,希望朋友们发现了说一下啊
相关文章推荐
- python 从共享文件中自动拷贝指定文件到本地
- vs生成的文件如何自动拷贝到指定目录
- 尝试为文件 F:\visual studio 2010\bkbs\paperCMS\App_Data\Project.mdf 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中。
- SparkStreaming python 读取kafka数据将结果输出到单个指定本地文件
- 利用Python实现在同一网络中的本地文件共享
- 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中[解决方法]
- [BAT] xcopy拷贝远程服务器共享文件到本地
- python实现拷贝指定文件到指定目录
- 尝试为文件附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中
- 通过python模块实现服务器和本地机器之间快速拷贝文件
- [BAT] 以当前时间为名创建文件夹,将本地文件夹里的文件拷贝到远程共享目录
- python指定后缀文件拷贝
- 定时find 指定文件 并复制到本地文件夹,然后自动scp到终端
- 附加自动命名的数据库,但失败。已存在同名的数据库,或指定的文件无法打开或位于 UNC 共享目录中[解决方法]
- 「python自动化运维」之自动生成配置文件并上传到目标服务器指定的位置
- 附加自动命名的数据库 但失败。已存在同名的数据库 或指定的文件无法打开或位于 unc 共享目录中。【解决方法】
- Python利用rsync自动同步服务器与本地文件同步
- 「python自动化运维」之自动生成配置文件并上传到目标服务器指定的位置
- 利用Python实现在同一网络中的本地文件共享方法