记一次Python环境迁移

Aristore

本文为个人探索的测试方案,并非成熟的生产级解决方案

0 前言

uv 是目前 Python 生态中最快的包管理器,而 micromamba 是最轻量的 Conda 替代品,本文笔者试图将二者融合

本文仅适用于 Windows,其它系统仅供参考

1 提取包名

用当前能打开的任意一个 Python 运行下面的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import os
import subprocess
import json
import glob
import platform

# === 配置区域 ===
OUTPUT_FILE = "requirements.txt"
# 忽略的基础工具包
IGNORE_PKGS = {
"pip", "setuptools", "wheel", "distribute", "wsgiref", "argparse", "python-dateutil"
}

def find_python_interpreters():
"""自动寻找系统中所有可能的 Python 解释器路径"""
python_paths = set()

# 1. 检查环境变量中的 Python
try:
if platform.system() == "Windows":
cmd = "where python"
else:
cmd = "which -a python3 python"

paths = subprocess.check_output(cmd, shell=True, text=True).strip().split('\n')
for p in paths:
if p and os.path.isfile(p):
python_paths.add(p.strip())
except:
pass

# 2. 检查 Python Launcher 记录的路径
if platform.system() == "Windows":
try:
py_out = subprocess.check_output("py --list-paths", shell=True, text=True)
for line in py_out.splitlines():
if "python.exe" in line:
# 提取路径
path = line.split()[-1]
python_paths.add(path)
except:
pass

# 3. 暴力扫描常见安装目录
user_profile = os.environ.get("USERPROFILE", "")
search_patterns = [
r"C:\Python*\python.exe", # C盘根目录旧版本
r"C:\Program Files\Python*\python.exe",
r"C:\Program Files (x86)\Python*\python.exe",
os.path.join(user_profile, r"AppData\Local\Programs\Python\Python*\python.exe"), # 默认安装位
os.path.join(user_profile, r"scoop\apps\python\*\python.exe"), # Scoop
]

for pattern in search_patterns:
for p in glob.glob(pattern):
python_paths.add(p)

return sorted(list(python_paths))

def get_packages_from_python(python_path):
"""提取指定 Python 的包列表"""
print(f"📦 正在扫描: {python_path} ...")
try:
# 使用 json 格式获取
cmd = [python_path, "-m", "pip", "list", "--format=json", "--disable-pip-version-check"]
result = subprocess.run(cmd, capture_output=True, text=True)

if result.returncode != 0:
print(f" ⚠️ 无法读取 (可能未安装pip): {python_path}")
return set()

data = json.loads(result.stdout)
pkgs = set()
for item in data:
name = item['name']
if name.lower() not in IGNORE_PKGS:
pkgs.add(name) # 只存名字,不存版本号
print(f" ✅ 发现 {len(pkgs)} 个包")
return pkgs
except Exception as e:
print(f" ❌ 出错: {e}")
return set()

def main():
interpreters = find_python_interpreters()
print(f"\n🔎 找到了 {len(interpreters)} 个 Python 解释器。开始提取依赖...\n")

all_packages = set()

for py_path in interpreters:
pkgs = get_packages_from_python(py_path)
all_packages.update(pkgs)

# 保存结果
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
for pkg in sorted(all_packages):
f.write(f"{pkg}\n")

print(f"\n🎉 共合并了 {len(all_packages)} 个唯一的库,清单已保存至当前目录的: {OUTPUT_FILE}")

if __name__ == "__main__":
main()

当遇到类似 C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps\python.exe 的报错时,通常是 应用执行别名(App Execution Alias) 在起作用。这个功能会在你输入 python 时,如果没有安装 Python,自动弹出微软商店的下载页面。但问题在于这玩意经常会抢占 PATH 优先级,导致你明明装了 Python,终端里输入 python 却还是弹出应用商店。

你可以按照以下步骤禁用这个功能:

  1. 按下 🪟
  2. 搜索并点击 管理应用执行别名
  3. 在打开的列表中,找到 PythonPython3(通常有两个),把它们关掉即可

准备好 requirements.txt 后就可以着手清理了

2 清理

2.1 卸载程序

使用工具把所有形如 Python 2.x.xPython 3.x.xPython Launcher 的应用卸载

2.2 手动清理残留文件

卸载程序通常不会删除安装的库,所以文件夹还会留在那里

  1. 根据之前的扫描结果手动删除 Python 安装到的目录
  2. 清理用户配置目录 (按 🪟+R 输入路径回车):
    • 输入 %AppData%,删除文件夹 Python
    • 输入 %LocalAppData%,删除文件夹 Programs\Pythonpip

2.3 净化环境变量

这是最关键的一步,防止你在终端输入命令时指向不存在的目录。

  1. 按下 🪟
  2. 搜索并点击 编辑系统环境变量
  3. 点击 环境变量
  4. 检查 用户变量系统变量 这两栏里的 Path 条目
  5. 双击 Path,在列表里寻找并删除所有涉及 Python 的路径,例如:
    • D:\Python\...
    • D:\Python\Scripts
  6. 一路点击 确定 保存退出

3 安装环境

3.1 创建目录结构

打开 PowerShell,运行以下命令创建基础文件夹:

1
2
3
New-Item -ItemType Directory -Path "D:\Python\uv" -Force
New-Item -ItemType Directory -Path "D:\Python\micromamba" -Force
New-Item -ItemType Directory -Path "D:\Python\uv_cache" -Force

3.2 配置环境变量

配置环境变量来修改下载的 Python 版本和缓存的所在位置

在 PowerShell 中逐行复制并运行以下命令:

1
2
3
4
5
6
7
8
9
10
11
# 1. uv 程序安装路径
[System.Environment]::SetEnvironmentVariable("UV_INSTALL_DIR", "D:\Python\uv", "User")

# 2. uv 下载的 Python 版本
[System.Environment]::SetEnvironmentVariable("UV_PYTHON_INSTALL_DIR", "D:\Python\uv\python", "User")

# 3. uv 的缓存
[System.Environment]::SetEnvironmentVariable("UV_CACHE_DIR", "D:\Python\uv_cache", "User")

# 4. micromamba 的根目录
[System.Environment]::SetEnvironmentVariable("MAMBA_ROOT_PREFIX", "D:\Python\micromamba", "User")

运行完上述命令后关闭当前 PowerShell 窗口,重新打开一个新的使设置生效

3.3 安装 uv

重新打开 PowerShell 运行安装脚本:

1
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

安装完成后,重启终端并执行 uv --version,如果出现了形如 uv x.x.x (xxxxxxxxx xxxx-xx-xx) 的输出就说明安装成功了

3.4 安装 micromamba

micromamba 是单个文件,手动下载并初始化

  1. 下载与解压:

    访问 https://micro.mamba.pm/api/micromamba/win-64/latest 下载最新版,解压缩下载到的压缩包后将 Library\bin 文件夹下的 micromamba.exe 移动到 D:\Python\micromamba\

  2. 初始化 Shell:
    D:\Python\micromamba 目录下逐行运行以下 PowerShell 命令:

    1
    2
    .\micromamba.exe shell init -s powershell
    .\micromamba shell init -s cmd.exe

3.5 将 micromamba 添加到系统 PATH

运行 PowerShell 命令:

1
[Environment]::SetEnvironmentVariable('Path', ([Environment]::GetEnvironmentVariable('Path','User') -replace ';$','') + ';D:\Python\micromamba', 'User')

D:\Python\micromamba 改为 micromamba.exe 所在目录

4 换源

打开 PowerShell (必须是 PowerShell,因为它能设置永久环境变量)

4.1 配置 micromamba 源

将以下命令逐行复制并粘贴到 PowerShell 中运行:

1
2
3
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
micromamba config append channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
micromamba config set channel_priority flexible

运行 micromamba config list 查看最终配置

4.2 配置 uv 源

将以下命令复制并粘贴到 PowerShell 中运行:

1
[System.Environment]::SetEnvironmentVariable("UV_INDEX_URL", "https://pypi.tuna.tsinghua.edu.cn/simple", "User")

然后重启终端使其生效

5 使用 micromamba 创建主环境

5.1 创建环境

创建一个名为 main 的全局环境作为主要的 Python 工作区

在新打开的终端中运行以下命令(这将在 D:\Python\micromamba\envs\ 目录下创建一个名为 main 的新环境)

1
micromamba create -n main python=3.12 -y

5.2 激活环境

在任意目录激活环境:

1
micromamba activate main

6 使用 uv 安装库

main 环境激活的状态下用 uv 将之前备份好的库全部安装进去
在已激活的 (main) 环境中,运行以下命令:

1
uv pip install -r requirements.txt
  • 标题: 记一次Python环境迁移
  • 作者: Aristore
  • 创建于 : 2025-12-14 03:30:00
  • 更新于 : 2025-12-14 03:34:12
  • 链接: https://www.aristore.top/posts/uv_micromamba/
  • 版权声明: 版权所有 © Aristore,禁止转载。
评论