0

そのため、大きな zip ファイルを作成できるようにする make_archive 関数への最近の修正を使用するために、shutil モジュールにモンキーパッチを適用しようとしています。

私は何かを概念化した証拠なので、この問題を解決するための簡単なハックがあれば、自分がやりたいことを続けることができると思いました。

私のコード:

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)

だから問題は...それは何もしません。私は明らかに愚かなことをしていますが、私の人生では、それが何であるかはわかりません。長い間見た後に盲目になった明らかな何かがあると思いますので、新鮮な目が必要です。私は次の方法を試しました/これらに記載されている回答と照合しました:

モンキー パッチ 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')

これは、フォーマットに登録されている既存の callable を置き換えzipます。

于 2013-06-18T21:11:26.720 に答える