Python 库管理工具 V2
一个功能全面的 Python 库管理工具,帮助您管理、清理和迁移 Python 库,理论来说这个工具不会再更新。
主要功能
1. 库管理
- 查看已安装库: 以树状视图显示当前 Python 环境中所有已安装的库
- 搜索库: 快速查找特定的库
- 删除库: 一键删除选中的库
- 安装新库: 可通过界面安装新库,过程在独立 CMD 窗口中进行,避免界面卡死
2. 旧版本清理
- 自动扫描 Python 版本: 自动检测系统中安装的所有 Python 版本
- 选择清理版本: 可选择特定 Python 版本进行库清理
- 预览库列表: 查看特定 Python 版本中已安装的库
- 一键清理: 批量删除指定 Python 版本中的库
3. 库迁移
- 跨版本迁移: 将一个 Python 版本中的库迁移到当前使用的 Python 版本
- 智能过滤: 自动过滤系统库和已安装库,只迁移必要的库
- 批量安装: 自动安装源 Python 版本中的所有第三方库
近期更新内容
-
新增库迁移功能:
- 添加了"库迁移"按钮,支持将选中版本的库一键迁移至当前 Python 版本
- 智能过滤系统基础库,避免不必要的迁移
- 使用独立 CMD 窗口进行库安装,提高稳定性
-
优化旧版本检测:
- 改进 Python 版本扫描算法
- 支持自动检测多种 Python 版本(如 3.7、3.8、3.11、3.12 等)
- 优化版本排序,新版本优先显示
使用说明
库管理
- 打开应用后默认显示"库管理"选项卡
- 在此页面可以查看、搜索、安装和删除库
- 搜索框支持按库名快速筛选
- 选中库后点击"删除选中"可批量删除库
- 在"安装新库"输入框中输入库名后点击"安装"可安装新库
旧版本清理
- 切换到"旧版本清理"选项卡
- 点击"扫描 Python 版本"按钮自动检测系统中的 Python 版本
- 在列表中选择要操作的 Python 版本
- 点击"查看库列表"可预览该版本已安装的库
- 点击"清理库"可一键清理该版本中的第三方库
- 点击"库迁移"可将该版本的库迁移至当前 Python 版本
注意事项
- 删除库操作不可撤销,请谨慎操作
- 清理旧版本库前建议先查看库列表确认
- 系统库(如 pip、setuptools)将被保留,不会被清理
- 库迁移功能会打开多个 CMD 窗口,属于正常现象
系统要求
- 操作系统: Windows 7/8/10/11
- Python 3.6 或更高版本
- 管理员权限(部分操作需要)
截图
源码
import tkinter as tk
from tkinter import ttk, filedialog
import subprocess
from tkinter import messagebox
import sys
import json
import re
import os
import threading
import glob
class PackageManager:
def __init__(self):
self.root = tk.Tk()
self.root.title("Python库管理器")
self.root.geometry("1000x700")
# 设置主题色
self.style = ttk.Style()
self.style.configure("Treeview", rowheight=25)
self.style.configure("Custom.TFrame", background="#f0f0f0")
self.style.configure("Custom.TButton", padding=5)
# 创建主容器
self.container = ttk.Frame(self.root, style="Custom.TFrame")
self.container.pack(fill=tk.BOTH, expand=True, padx=15, pady=15)
# 创建选项卡
self.notebook = ttk.Notebook(self.container)
self.notebook.pack(fill=tk.BOTH, expand=True)
# 库管理选项卡
self.manage_tab = ttk.Frame(self.notebook)
self.notebook.add(self.manage_tab, text="库管理")
# 清理选项卡
self.clean_tab = ttk.Frame(self.notebook)
self.notebook.add(self.clean_tab, text="旧版本清理")
# =============== 库管理选项卡内容 ===============
# 创建搜索框
self.search_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
self.search_frame.pack(fill=tk.X, pady=(10, 10))
self.search_var = tk.StringVar()
self.search_var.trace('w', self.filter_packages)
self.search_entry = ttk.Entry(
self.search_frame,
textvariable=self.search_var,
font=('微软雅黑', 9)
)
self.search_entry.pack(side=tk.LEFT, fill=tk.X, expand=True)
self.search_entry.insert(0, "搜索库名...")
self.search_entry.bind('<FocusIn>', lambda e: self.on_entry_click())
self.search_entry.bind('<FocusOut>', lambda e: self.on_focus_out())
# 创建主框架
self.main_frame = ttk.Frame(self.manage_tab)
self.main_frame.pack(fill=tk.BOTH, expand=True)
# 创建树状视图
self.tree = ttk.Treeview(
self.main_frame,
columns=("版本", "主要用途"),
selectmode="extended",
style="Custom.Treeview"
)
self.tree.heading("#0", text="库名")
self.tree.heading("版本", text="版本")
self.tree.heading("主要用途", text="主要用途")
# 调整列宽
self.tree.column("#0", width=200, minwidth=150)
self.tree.column("版本", width=100, minwidth=80)
self.tree.column("主要用途", width=500, minwidth=300)
# 添加垂直滚动条
self.v_scrollbar = ttk.Scrollbar(
self.main_frame,
orient="vertical",
command=self.tree.yview
)
self.tree.configure(yscrollcommand=self.v_scrollbar.set)
# 添加水平滚动条
self.h_scrollbar = ttk.Scrollbar(
self.main_frame,
orient="horizontal",
command=self.tree.xview
)
self.tree.configure(xscrollcommand=self.h_scrollbar.set)
# 布局
self.tree.grid(row=0, column=0, sticky="nsew")
self.v_scrollbar.grid(row=0, column=1, sticky="ns")
self.h_scrollbar.grid(row=1, column=0, sticky="ew")
self.main_frame.grid_rowconfigure(0, weight=1)
self.main_frame.grid_columnconfigure(0, weight=1)
# 安装库框架
self.install_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
self.install_frame.pack(fill=tk.X, pady=(10, 0))
# 安装库标签
self.install_label = tk.Label(
self.install_frame,
text="安装新库:",
background="#f0f0f0",
font=('微软雅黑', 9)
)
self.install_label.pack(side=tk.LEFT, padx=(0, 5))
# 安装库输入框
self.install_var = tk.StringVar()
self.install_entry = ttk.Entry(
self.install_frame,
textvariable=self.install_var,
font=('微软雅黑', 9),
width=30
)
self.install_entry.pack(side=tk.LEFT, padx=5)
# 安装按钮
self.install_btn = ttk.Button(
self.install_frame,
text="安装",
command=self.install_package,
style="Custom.TButton"
)
self.install_btn.pack(side=tk.LEFT, padx=5)
# 按钮框架
self.button_frame = ttk.Frame(self.manage_tab, style="Custom.TFrame")
self.button_frame.pack(fill=tk.X, pady=(10, 0))
self.refresh_btn = ttk.Button(
self.button_frame,
text="刷新列表",
command=self.refresh_packages,
style="Custom.TButton"
)
self.refresh_btn.pack(side=tk.LEFT, padx=5)
self.delete_btn = ttk.Button(
self.button_frame,
text="删除选中",
command=self.delete_selected,
style="Custom.TButton"
)
self.delete_btn.pack(side=tk.LEFT, padx=5)
# =============== 清理选项卡内容 ===============
self.init_clean_tab()
# 状态栏
self.status_bar = tk.Label(
self.container,
text="就绪",
bd=1,
relief=tk.SUNKEN,
anchor=tk.W,
background="#f0f0f0",
font=('微软雅黑', 9)
)
self.status_bar.pack(fill=tk.X, pady=(10, 0))
# 存储Python版本信息的字典
self.python_versions = {
}
# 刷新库列表
self.all_packages = []
self.refresh_packages()
# 自动扫描Python版本
self.scan_python_versions()
def on_entry_click(self):
if self.search_entry.get() == '搜索库名...':
self.search_entry.delete(0, tk.END)
self.search_entry.config(foreground='black')
def on_focus_out(self):
if self.search_entry.get() == '':
self.search_entry.insert(0, '搜索库名...')
self.search_entry.config(foreground='gray')
def write_log(self, message):
"""写入日志到日志文本框"""
self.log_text.insert(tk.END, f"{
message}\n")
self.log_text.see(tk.END)
self.root.update()
def scan_python_versions(self):
"""扫描系统中安装的Python版本"""
self.python_info.delete(0, tk.END)
self.python_versions.clear()
self.write_log("开始扫描Python版本...")
# 记录当前运行的Python版本
current_python = sys.executable
current_version = f"{
sys.version_info.major}.{
sys.version_info.minor}.{
sys.version_info.micro}"
self.write_log(f"当前运行的Python版本: {
current_version} ({
current_python})")
found_versions = []
# 扫描常见安装位置
possible_locations = []
# Windows常见安装位置
for drive in ['C:', 'D:', 'E:', 'F:']:
if os.path.exists(drive):
# 标准安装
possible_locations.extend(glob.glob(f"{
drive}\\Python*"))
possible_locations.extend(glob.glob(f"{
drive}\\Program Files\\Python*"))
possible_locations.extend(glob.glob(f"{
drive}\\Program Files (x86)\\Python*"))
# 用户安装
possible_locations.extend(glob.glob(f"{
drive}\\Users\\*\\AppData\\Local\\Programs\\Python\\Python*"))
# Anaconda/Miniconda
possible_locations.extend(glob.glob(f"{
drive}\\Users\\*\\Anaconda*"))
possible_locations.extend(glob.glob(f"{
drive}\\Users\\*\\Miniconda*"))
possible_locations.extend(glob.glob(f"{
drive}\\ProgramData\\Anaconda*"))
possible_locations.extend(glob.glob(f"{
drive}\\ProgramData\\Miniconda*"))
# 检查PATH环境变量中的Python
path_dirs = os.environ.get('PATH', '').split(os.pathsep)
for path_dir in path_dirs:
if os.path.exists(path_dir):
python_exes = glob.glob(os.path.join(path_dir,