shutil.make_archive线程安全吗?

时间:2017-01-13 00:51:56

标签: python-2.7 archive shutil

我正在尝试使用python中的线程使用shutil.make_archive压缩多个文件夹。我看到较小的文件夹完全拉链,同时另一个线程也会停止压缩。

那么,shutil.make_archive线程安全吗?

2 个答案:

答案 0 :(得分:1)

shutil.make_archive() 线程安全。

它的原因是它改变了当前工作目录,这是该进程的全局工作目录。线程没有自己的工作目录。请参阅Python 2.7中的相关代码:

save_cwd = os.getcwd()
if root_dir is not None:
    if logger is not None:
        logger.debug("changing into '%s'", root_dir)
    base_name = os.path.abspath(base_name)
    if not dry_run:
        os.chdir(root_dir)

if base_dir is None:
    base_dir = os.curdir
...

该函数在执行开始时保存当前工作目录并在返回之前恢复它,但这对于线程安全来说还不够。

答案 1 :(得分:1)

这是我基于 this answershutil.make_archive线程安全替代

import zipfile
import os

def make_archive_threadsafe(zip_name: str, path: str):
    with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zip:
        for root, dirs, files in os.walk(path):
            for file in files:
                zip.write(os.path.join(root, file), os.path.relpath(os.path.join(root, file), path))

make_archive_threadsafe('/root/backup.zip', '/root/some_data/')

请注意,make_archive 在内部也使用了 ZipFile,因此这应该是可靠的。

与我链接的答案不同 - 个人喜好,这不包括文件夹到压缩文件(“单个顶级文件夹”)。

代码是 Python 3,但如果您删除类型注释,则可以在 Python 2 中运行。