0

所以我试图对shutil模块进行monkeypatch,以便对他们的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)

所以问题是......它没有做任何事情。我显然在做一些愚蠢的事情,但对于我的生活,我看不到它是什么。我假设有一些明显的东西在看了这么久之后我已经变得盲目了,所以需要一些新鲜的眼睛。我尝试了以下方法/检查这些中描述的答案:

Monkey-patch Python 类 Python 猴子补丁私有函数什么是猴子补丁?

加上其他一些。没有欢乐

4

1 回答 1

5

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

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

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

这将替换为该zip格式注册的现有可调用对象。

于 2013-06-18T21:11:26.720 回答