2013-06-18 6 views
0

그래서 큰 zip 파일을 만들 수있는 make_archive 함수에 최근 수정 사항을 사용하기 위해 shutil 모듈을 monkeypatch하려고합니다.왜 몽둥이가 시끄럽게 움직이지 않으려 고 시도하는 것이 효과가 없습니까?

나는 개념적으로 뭔가를 증명하고 있으므로이 문제를 해결하기위한 빠른 해킹을 생각하면 내가하고 싶은 일에 착수 할 수 있습니다.

내 코드 :

import shutil 
import os 

def _make_zipfile(base_name, base_dir, verbose=0, dry_run=0, logger=None): 
    zip_filename = base_name + ".zip" 
    archive_dir = os.path.dirname(base_name) 

    if not os.path.exists(archive_dir): 
     if logger is not None: 
      logger.info("creating %s", archive_dir) 
     if not dry_run: 
      os.makedirs(archive_dir) 

    # If zipfile module is not available, try spawning an external 'zip' 
    # command. 
    try: 
     import zipfile 
    except ImportError: 
     zipfile = None 

    if zipfile is None: 
     shutil._call_external_zip(base_dir, zip_filename, verbose, dry_run) 
    else: 
     if logger is not None: 
      logger.info("creating '%s' and adding '%s' to it", 
         zip_filename, base_dir) 

     if not dry_run: 
      zip = zipfile.ZipFile(zip_filename, "w", 
            compression=zipfile.ZIP_DEFLATED, 
            allowZip64=True) # this is the extra argument 

      for dirpath, dirnames, filenames in os.walk(base_dir): 
       for name in filenames: 
        path = os.path.normpath(os.path.join(dirpath, name)) 
        if os.path.isfile(path): 
         zip.write(path, path) 
         if logger is not None: 
          logger.info("adding '%s'", path) 
      zip.close() 

shutil._make_zipfile = _make_zipfile 

# This function calls _make_zipfile when it runs 
shutil.make_archive('blah', someargs) 

그래서 문제는 ... 그것은 아무것도하지 않습니다. 나는 분명히 어리석은 짓을하고있다. 그러나 내 인생에서 나는 그것이 무엇인지를 볼 수 없다. 나는 오랫동안 그것을보고 난 후에 장님이되었다는 것을 명백한 것이 있다고 가정하고 있으므로 신선한 눈이 필요합니다. 나는이 설명 답변에 대해 확인/방법을 다음과 같은 시도 :

Monkey-patch Python class Python monkey patch private function

플러스 일부 다른 What is a monkey patch?. 기쁨 없음

답변

5

_ARCHIVE_FORMATS 매핑을 업데이트해야합니다. 임포트 할 때 함수에 대한 참조를 저장하기 때문에 패치하기 전에 참조하십시오. shutil.make_archive()은 해당 매핑을 사용하며 _make_zipfile 함수는 직접 사용하지 않습니다.

당신은 zip 아카이버를 다시 정의하는 공공 shutil.register_archive_format() function를 사용할 수 있습니다

shutil.register_archive_format('zip', _make_zipfile, description='ZIP file') 

이것은 zip 형식에 등록 된 기존의 호출을 대체합니다.

+1

당신은 아주 좋은 사람입니다. 나는 그 라인을보고 이상하게 여겼지 만, _make_zipfile 함수를 패치하는 3 가지 동등한 방법을 시도하는 무한 루프에 갇혀있다. 아, 카페인이 충분하지 않거나 너무 많습니다. –

+1

+++ CAFFEINE ERROR +++ REDO from START +++ 16 진수가 말한대로. –