pyrhon-文件备份程序(90)

本文介绍了一个使用Python编写的备份脚本,该脚本能够执行完全备份和增量备份。通过使用md5校验和来检查文件的更改,并在周一执行完全备份,其余时间执行增量备份。脚本利用了os、tarfile、hashlib和pickle等模块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import time
import os
import tarfile
import hashlib
import pickle

def check_md5(fname):
    m = hashlib.md5()   #创建md5对象
    with open(fname,'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  #更新md5对象
    return m.hexdigest()    #返回md5对象

def full_backup(src_dir,dst_dir,md5file):   #完全备份
    fname = os.path.basename(src_dir.rstrip('/'))   #去除目录最后的根号(rstrip()),取最后的一个单个文件(basename())
    fname = '%s_full_%s.tar.gz' % (fname,time.strftime('%Y%m%d'))   #备份后包的名字:文件名_full_日期.tar.gz
    fname = os.path.join(dst_dir,fname) #合并路径,形成绝对路径
    md5dict = {}    #定义一个字典,用于放文件名和对应的md5值

    tar = tarfile.open(fname,'w:gz')    ###对文件进行打包
    tar.add(src_dir)    #添加要打包的目录
    tar.close()

    for path,folders,files in os.walk(src_dir): #walk(),遍历目录树,自顶向下或自底向上生成目录树下的文件名
        for each_file in files:
            key = os.path.join(path,each_file)  #合并路径
            md5dict[key] = check_md5(key)   #添加到字典

        with open(md5file,'wb') as fobj:
            pickle.dump(md5dict,fobj)   #将字典的内容添加到文件中

def incr_backup(src_dir,dst_dir,md5file):   #增量备份
    fname = os.path.basename(src_dir.rstrip('/'))
    fname = '%s_incr_%s.tar.gz' % (fname,time.strftime('%Y%m%d'))
    fname = os.path.join(dst_dir,fname)
    md5dict = {}

    with open(md5file,'rb') as fobj:
        oldmd5 = pickle.load(fobj)      #将旧的md5值从文件内取出来

    for path,folders,files in os.walk(src_dir):
        for each_file in files:
            key = os.path.join(path,each_file)
            md5dict[key] = check_md5(key)   #向字典内添加新的md5值

    with open(md5file,'wb') as fobj:
        pickle.dump(md5dict,fobj)   #将新的那个md5字典内容写入文件内

    tar = tarfile.open(fname,'w:gz')
    for key in md5dict:     #循环遍历,将旧的字典内容与新的字典内容进行比对,然后将有改变的文件进行打包
        if oldmd5.get(key) != md5dict[key]:
            tar.add(key)
    tar.close()

if __name__ == '__main__':
    #mkdir /tmp/backup;cp -r /etc/security /tmp/
    src_dir = '/tmp/security'
    dst_dir = '/tmp/backup'
    md5file = '/tmp/backup/md5.data'
    if time.strftime('%a') == 'Mon':    #星期一,完全备份,否则增量备份
        full_backup(src_dir,dst_dir,md5file)
    else:
        incr_backup(src_dir,dst_dir,md5file)









<think>嗯,用户问的是“pyrhon mkl-service是什么包”,首先注意到用户可能打错了“python”为“pyrhon”。这个问题需要先纠正拼写错误,然后解释正确的包名“mkl-service”是什么。接下来,我需要确定用户为什么会提到这个包,可能是在安装或使用过程中遇到了问题,或者需要了解其功能和用途。 首先,确认“mkl-service”包的正确性。根据我的知识,正确的包名应该是“mkl-service”,属于Intel Math Kernel Library(MKL)的一部分。这个包通常与NumPy等科学计算库一起使用,用于加速数学运算。用户可能在使用某些科学计算或机器学习库时遇到了依赖问题,或者想了解如何优化性能。 然后,用户可能想知道如何安装或解决与该包相关的问题。考虑到常见的安装问题,比如通过pip安装时的兼容性,或者与Anaconda环境中的MKL集成。需要解释不同安装方式下的情况,例如conda会自动安装MKL,而pip可能需要额外步骤。 此外,用户可能对MKL的功能和优势感兴趣,比如它提供的优化数学函数,如何提升性能。需要简要说明这些技术细节,但保持易懂。同时,用户可能关心如何验证MKL是否正确安装并被使用,比如在Python中运行测试代码检查版本信息。 还需要注意用户可能的环境配置问题,比如是否使用了正确的Python环境,是否安装了正确版本的包。如果用户遇到错误,可能需要指导他们如何检查安装情况,或者建议使用conda来避免依赖问题。 最后,总结关键点,确保回答结构清晰,覆盖用户可能的需求:纠正拼写错误,解释包的功能,安装方法,验证步骤,以及常见问题的解决方法。确保语言简洁,步骤明确,帮助用户有效解决问题。</think>你提到的 `pyrhon mkl-service` 可能是笔误,正确的包名为 **`mkl-service`**。以下是关于此包的详细介绍: --- ### 一、`mkl-service` 是什么? 1. **所属库** `mkl-service` 是 **Intel Math Kernel Library (MKL)** 的辅助工具包,专门为 Python 提供接口,用于管理和优化 Intel MKL 在 Python 环境中的行为。 2. **核心功能** - 动态调整 MKL 的线程数(例如设置单线程或多线程计算)。 - 查询 MKL 版本和运行时配置。 - 优化科学计算库(如 NumPy、SciPy)的底层数学运算性能。 3. **依赖关系** 通常与 `mkl` 或 `intel-openmp` 包一起安装,常见于通过 `conda` 或 Intel 官方渠道安装的科学计算环境。 --- ### 二、`mkl-service` 的典型使用场景 1. **加速科学计算** 当使用基于 MKL 优化的 NumPy/SciPy 时,`mkl-service` 可帮助控制并行计算资源,避免多线程竞争导致性能下降。 2. **调试性能问题** 通过以下代码检查当前 MKL 配置: ```python import mkl print(mkl.get_version()) # 输出 MKL 版本 print(mkl.get_max_threads()) # 显示最大线程数 ``` --- ### 三、如何安装 `mkl-service`? #### 方法1:通过 conda(推荐) Intel MKL 及其组件通常通过 conda 自动安装: ```cmd conda install mkl-service ``` > **注**:在 conda 环境中安装 NumPy/SciPy 时,默认会捆绑 MKL 优化版本。 #### 方法2:通过 pip(需手动配置) 若需单独安装: ```cmd pip install mkl-service ``` 但需确保系统已安装 Intel MKL 运行时库,否则可能无法使用。 --- ### 四、验证 `mkl-service` 是否生效 1. **检查包是否存在** ```cmd conda list | findstr mkl-service # Windows pip show mkl-service ``` 2. **测试功能** 运行以下 Python 代码: ```python import mkl print(mkl.__version__) # 输出 mkl-service 版本 mkl.set_num_threads(4) # 设置 MKL 使用 4 个线程 ``` --- ### 五、常见问题 #### 1. **报错 `No module named 'mkl'`** - **原因**:未安装 `mkl-service` 或环境未激活。 - **解决**:通过 conda 安装或检查 Python 环境路径。 #### 2. **性能未提升** - **原因**:未使用 MKL 优化的 NumPy/SciPy。 - **解决**:通过 conda 重新安装科学计算库(conda 默认集成 MKL)。 --- ### 六、MKL 与其他数学库对比 | 特性 | Intel MKL | OpenBLAS | |--------------|-------------------|-------------------| | 优化架构 | Intel 处理器 | 多平台通用 | | 线程控制 | 通过 `mkl-service`| 环境变量设置 | | 典型用户 | Anaconda 用户 | 开源轻量化方案 | --- 若需进一步控制 MKL 行为,可参考 [Intel 官方文档](https://software.intel.com/content/www/us/en/develop/documentation/mkl-developer-reference-c/top.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值