为什么我尝试猴子修补shutil无法正常工作?

Tom*_*eld 0 python monkeypatching shutil python-2.7

所以我试图monkeypatch shutil模块,以便使用最新的make_archive函数修复,允许创建大型zip文件.

我是一个概念性的证据,所以想到一个快速的黑客来解决这个问题会让我继续我想做的事情.

我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

所以问题是......它没有做任何事情.我显然做了一些愚蠢的事,但对于我的生活,我看不出它是什么.我假设有一些显而易见的事情,我看了很长时间后都变得盲目,所以需要一些新鲜的眼睛.我尝试了以下方法/检查这些中描述的答案:

Monkey-patch Python类 Python猴子补丁私有功能什么是猴子补丁?

加上其他一些.没有快乐

Mar*_*ers 5

你必须更新_ARCHIVE_FORMATS映射; 它会在导入时存储对该函数的引用,因此在您对其进行修补之前.shutil.make_archive()使用该映射,而不是_make_zipfile直接使用该函数.

您可以使用public shutil.register_archive_format()函数重新定义zip归档器:

shutil.register_archive_format('zip', _make_zipfile, description='ZIP file')
Run Code Online (Sandbox Code Playgroud)

这将替换为该zip格式注册的现有callable .