自动清理pypi缓存的脚本

wen 实用脚本 3

本文目录导读:

自动清理pypi缓存的脚本

  1. 方案1:基础清理脚本(适用于Linux/Mac)
  2. 方案2:更全面的清理脚本(多平台支持)
  3. 方案3:Python脚本(跨平台兼容性更好)
  4. 方案4:增量清理脚本(保留最近使用的包)
  5. 使用说明
  6. 注意事项

方案1:基础清理脚本(适用于Linux/Mac)

#!/bin/bash
# 文件名:clean_pip_cache.sh
echo "开始清理pip缓存..."
# 清理pip缓存
pip cache purge
# 清理wheel缓存
pip install --no-cache-dir -U pip
# 显示清理后的缓存大小
echo "当前pip缓存大小:"
pip cache info
echo "清理完成!"

方案2:更全面的清理脚本(多平台支持)

#!/bin/bash
# 文件名:clean_pip_cache_complete.sh
echo "====== pip缓存清理工具 ======"
# 获取当前平台
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    echo "检测到Linux系统"
    CACHE_DIR="$HOME/.cache/pip"
elif [[ "$OSTYPE" == "darwin"* ]]; then
    echo "检测到macOS系统"
    CACHE_DIR="$HOME/Library/Caches/pip"
elif [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]]; then
    echo "检测到Windows系统"
    CACHE_DIR="$USERPROFILE/pip/cache"
else
    echo "未知系统类型,使用默认路径"
    CACHE_DIR="$HOME/.cache/pip"
fi
# 显示当前缓存状态
echo "缓存目录: $CACHE_DIR"
echo "当前缓存大小:"
du -sh "$CACHE_DIR" 2>/dev/null || echo "无法获取缓存大小"
# 清理pip缓存
echo ""
echo "正在清理pip缓存..."
pip cache purge
# 清理wheelhouse缓存(如果存在)
WHEELHOUSE_DIR="$HOME/.wheelhouse"
if [ -d "$WHEELHOUSE_DIR" ]; then
    echo "清理wheelhouse缓存..."
    rm -rf "$WHEELHOUSE_DIR"
fi
# 清理临时文件
echo "清理临时文件..."
pip install --no-cache-dir -U pip 2>/dev/null
# 显示清理后的状态
echo ""
echo "清理完成!"
echo "新的缓存大小:"
pip cache info
# 可选:显示保存空间
OLD_SIZE=$(du -sh "$CACHE_DIR" 2>/dev/null | cut -f1)
echo "已清理缓存,节省了 $OLD_SIZE 空间" || echo "未知清理大小"

方案3:Python脚本(跨平台兼容性更好)

#!/usr/bin/env python3
# 文件名:clean_pip_cache.py
import os
import shutil
import subprocess
import platform
import sys
def get_pip_cache_dir():
    """获取pip缓存目录"""
    system = platform.system().lower()
    if system == "windows":
        # Windows通常使用 %APPDATA%
        return os.path.expandvars(r"%APPDATA%\pip\cache")
    elif system == "darwin":  # macOS
        return os.path.join(os.path.expanduser("~"), "Library", "Caches", "pip")
    else:  # Linux and others
        return os.path.join(os.path.expanduser("~"), ".cache", "pip")
def get_cache_size(path):
    """获取缓存目录大小"""
    try:
        total = 0
        if os.path.exists(path):
            for root, dirs, files in os.walk(path):
                for f in files:
                    fp = os.path.join(root, f)
                    try:
                        total += os.path.getsize(fp)
                    except OSError:
                        pass
        return total
    except Exception as e:
        print(f"无法计算缓存大小: {e}")
        return 0
def format_size(bytes_size):
    """格式化文件大小"""
    for unit in ['B', 'KB', 'MB', 'GB']:
        if bytes_size < 1024:
            return f"{bytes_size:.2f} {unit}"
        bytes_size /= 1024
    return f"{bytes_size:.2f} TB"
def clean_pip_cache():
    """清理pip缓存"""
    print("====== pip缓存清理工具 ======")
    cache_dir = get_pip_cache_dir()
    print(f"检测到缓存目录: {cache_dir}")
    # 获取清理前的缓存大小
    old_size = get_cache_size(cache_dir)
    print(f"当前缓存大小: {format_size(old_size)}")
    # 方法1:使用pip命令清理
    print("\n正在使用pip命令清理...")
    try:
        result = subprocess.run(
            [sys.executable, "-m", "pip", "cache", "purge"],
            capture_output=True,
            text=True,
            timeout=30
        )
        if result.returncode == 0:
            print("pip cache purge执行成功")
            if result.stdout:
                print(result.stdout)
        else:
            print(f"pip命令执行失败: {result.stderr}")
    except subprocess.TimeoutExpired:
        print("命令执行超时")
    except Exception as e:
        print(f"执行pip命令出错: {e}")
    # 方法2:手动删除缓存目录
    print("\n正在手动清理缓存目录...")
    if os.path.exists(cache_dir):
        try:
            shutil.rmtree(cache_dir)
            print(f"成功删除缓存目录: {cache_dir}")
        except PermissionError:
            print(f"权限不足,无法删除: {cache_dir}")
            print("尝试只清空目录内容...")
            for item in os.listdir(cache_dir):
                item_path = os.path.join(cache_dir, item)
                try:
                    if os.path.isfile(item_path):
                        os.remove(item_path)
                    elif os.path.isdir(item_path):
                        shutil.rmtree(item_path)
                    print(f"  已删除: {item}")
                except Exception as e:
                    print(f"  无法删除 {item}: {e}")
    else:
        print("缓存目录不存在,无需清理")
    # 计算清理后的缓存大小
    new_size = get_cache_size(cache_dir)
    saved_space = old_size - new_size
    print(f"\n====== 清理完成 ======")
    print(f"原始缓存大小: {format_size(old_size)}")
    print(f"当前缓存大小: {format_size(new_size)}")
    print(f"节省空间: {format_size(saved_space)}")
if __name__ == "__main__":
    clean_pip_cache()

方案4:增量清理脚本(保留最近使用的包)

#!/bin/bash
# 文件名:clean_pip_cache_incremental.sh
echo "增量清理pip缓存(保留最近使用过的包)..."
# 清理超过30天未使用的缓存
find "$HOME/.cache/pip" -type f -atime +30 -delete 2>/dev/null
# 清理空的目录
find "$HOME/.cache/pip" -type d -empty -delete 2>/dev/null
echo "清理完成!保留最近30天内使用的缓存。"
pip cache info

使用说明

  1. 赋予执行权限(Linux/Mac):

    chmod +x clean_pip_cache.sh
  2. 运行脚本

    # Bash脚本
    ./clean_pip_cache.sh
    # Python脚本
    python3 clean_pip_cache.py
  3. 设置定时任务(可选,Linux/Mac):

    # 每月自动清理
    crontab -e
    # 添加以下行(每月1号凌晨2点执行)
    0 2 1 * * /path/to/clean_pip_cache.sh

注意事项

  • 备份重要数据:清理前建议确认没有正在使用的包
  • 权限问题:Windows可能需要管理员权限
  • 虚拟环境:如果使用virtualenv或conda,清理的是全局缓存
  • 生产环境:建议在非工作时间执行清理

选择最适合你平台的脚本执行即可。

抱歉,评论功能暂时关闭!