2014-02-18 96 views
0

我使用多个Python会话同时从一个ftp服务器下载多个文件。在某些时候,一个会话(我怀疑)读取正在由另一个进程访问的文件,并引发以下错误:处理并行ftp下载错误

Traceback (most recent call last): File 
"F:\utilities\python\downloadFTP_NV.py", line 66, in <module> 
    os.unlink(FILE) WindowsError: [Error 32] The process cannot access the file because it is being used by another process: 
u'm_4011851_ne_11_1_20100620.tif' 

这似乎在那里我找不到处理的最佳方式的代码块错误和移动到下一个文件下载:

 # Set logic so that already downloaded or partially 
     # downloaded files will not be downloaded again 
     if os.path.exists(fileCheck): # "fileCheck" is a file prior to renaming 
      print 'File "%s" exists already' % name 
      pass 

     elif os.path.exists(fileCheck2): # "fileCheck2 is a file after renaming 
      print 'File "%s" exists already' % FILE 
      pass 

     else: 
      try: 
       f.cwd(DIRN + folder) 
       start = time.clock() 
       f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write) 
       end = time.clock() 
       arcpy.Rename_management(os.path.join(workspace, FILE), os.path.join(workspace, name)) 
      except ftplib.error_perm: 
       print 'ERROR: cannot read file "%s"' % FILE 
       os.unlink(FILE) 

我曾经想过加入另一except语句和time.sleep(5),以帮助减少重叠的过程。或者也许只是删除os.unlink(FILE)行。 处理这类错误的最佳方法是什么?

回答

2

我知道这个职位是3岁,但对于其他用户着想,可能也许有同样的问题,我会给出一个可能的解决方案 在你的代码,我没有看到你的操作后关闭您的文件,所以我认为这是问题所在。作为最佳实践,使用with语句总是很好,因为它提供了上下文管理器和更好的错误处理。

所以你的代码的一部分,你检索文件应该是这样的

with open(FILE, 'wb') as fhandle: 
     ftp.retrbinary('RETR ' + FILE, fhandle.write) 

这应该解决您的问题。而且你不需要os.unlink(FILE)

如果您需要了解的with声明了一些背景的相关信息,这是访问PEP 343 -- The "with" Statement

的地方
1

我想说问题在于如何启动会话并允许它们重叠文件。尝试在一个主会话中运行它们,并传递文件作为参数下载。

或者您可以使用multiprocessing模块,这可能会更容易。

我猜paraller下载多个文件时,你不应该有两个进程正在操作相同的文件(只要你不以paraller方式下载一个文件)的情况。