我正在尝试使用python中的线程使用shutil.make_archive压缩多个文件夹。我看到较小的文件夹完全拉链,同时另一个线程也会停止压缩。
那么,shutil.make_archive线程安全吗?
答案 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 answer 的 shutil.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 中运行。