2014-02-18 2 views
0

여러 세션을 동시에 사용하여 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' 

이 내가 처리하는 가장 좋은 방법을 찾을 수 없습니다 코드의 블록입니다 다음 파일에 오류 및 이동 다운로드 : 나는 중복 프로세스를 줄이는 데 도움이되는 time.sleep(5)와 다른 except 문을 추가하는 방법에 대한 생각

 # 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) 

. 아니면 단순히 os.unlink(FILE) 행을 삭제하면됩니다. 이 같은 오류를 처리하는 가장 좋은 방법은 무엇입니까?

답변

2

나는이 게시물이 3 년 된 것을 알고 있지만, 다른 사용자를 위해 아마도 같은 문제가있을 수 있으므로 가능한 해결책을 드릴 것입니다. 코드에서 작동 후 파일이 닫히지 않습니다. , 그래서 그것이 문제가있는 곳이라고 생각합니다. 컨텍스트 관리자와 더 나은 오류 처리 기능을 제공하므로 항상 최선의 방법으로 with 문을 사용하는 것이 좋습니다.

그래서 당신이 파일을 검색 코드의 당신의 부분은 당신의 문제를 해결해야이

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

같이해야한다. 당신이 with 문에 대한 몇 가지 배경 정보를 정기적으로해야하는 경우 그리고 당신은 os.unlink(FILE)

필요하지 않습니다,이 PEP 343 -- The "with" Statement

를 방문 할 수있는 장소입니다
1

나는 세션을 시작하고 파일을 겹치게하는 방법에 문제가 있다고 말할 수 있습니다. 하나의 마스터 세션에서 실행하고 파일을 매개 변수로 다운로드하여 전달하십시오.

또는 multiprocessing 모듈을 사용하는 것이 더 쉬울 수도 있습니다.

필자가 여러 파일을 다운로드하는 동안 두 개의 프로세스가 동일한 파일에서 작동하도록하는 경우가 없어야합니다 (하나의 파일을 다른 파일로 다운로드하지 않는 한).