# Python 虚拟环境

虚拟环境隔离项目依赖，避免污染全局环境。**强烈建议每个项目独立 venv**。

## venv（标准库，首选）

```bash
# 创建（Python 3.3+ 自带）
python3 -m venv .venv

# 激活
# macOS / Linux:
source .venv/bin/activate
# Windows CMD:
.venv\Scripts\activate.bat
# Windows PowerShell:
.venv\Scripts\Activate.ps1

# 验证（路径应指向 .venv）
which python    # macOS / Linux
where python    # Windows

# 安装依赖
pip install -r requirements.txt

# 退出
deactivate
```

### 用 Hatch 安装的 Python 创建 venv

```bash
${DESIRECORE_ROOT}/runtime/hatch/local/3.12/python/bin/python3 -m venv .venv
source .venv/bin/activate
```

## pipx（全局 CLI 工具）

`pipx` 把每个 CLI 工具装在独立 venv 里，对外暴露 shim，不污染系统/项目 Python。

```bash
# 安装 pipx
brew install pipx                # macOS
sudo apt install pipx            # Ubuntu/Debian
pip install --user pipx          # 通用兜底
pipx ensurepath
exec "$SHELL"

# 安装 CLI 工具
pipx install black
pipx install ruff
pipx install markitdown
pipx install poetry
pipx install uv

# 升级
pipx upgrade-all

# 卸载
pipx uninstall black

# 列表
pipx list
```

适用场景：black / ruff / mypy / poetry / uv / markitdown 等命令行工具。

## conda / miniconda（数据科学）

适用于：需要 BLAS / CUDA / 非 Python 依赖（科学计算）。

```bash
# 安装 miniconda（macOS / Linux）
curl -fsSL "https://repo.anaconda.com/miniconda/Miniconda3-latest-$(uname -s)-$(uname -m).sh" -o miniconda.sh
bash miniconda.sh -b -p "$HOME/miniconda3"
eval "$("$HOME/miniconda3/bin/conda" shell.$(basename $SHELL) hook)"

# Windows: 下载 https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe 安装

# 创建环境
conda create -n myproject python=3.12
conda activate myproject

# 装包（conda 优先，pip 兜底）
conda install numpy pandas scikit-learn
pip install some-pypi-only-package

# 导出 / 还原
conda env export > environment.yml
conda env create -f environment.yml

# 退出
conda deactivate
```

### conda 与 DesireCore Hatch 共存

两者都把 Python 装在用户目录，互不影响。规则：
- 数据科学项目（涉及 numpy/pandas/jupyter/CUDA）→ conda
- 普通 Web/CLI/办公技能 → Hatch + venv

## requirements.txt 与 pyproject.toml

### requirements.txt（简单）

```
fastapi==0.111.0
pydantic>=2.0,<3.0
markitdown
```

### pyproject.toml（现代）

```toml
[project]
name = "myproj"
version = "0.1.0"
requires-python = ">=3.10"
dependencies = [
  "fastapi>=0.111",
  "pydantic>=2.0,<3.0",
]

[project.optional-dependencies]
dev = ["pytest", "ruff", "mypy"]
```

安装：`pip install -e .` 或 `pip install -e ".[dev]"`。

## 何时用哪个

| 场景 | 工具 |
|------|------|
| 普通 Python 项目 | venv + pip |
| 全局 CLI 工具（black/ruff/markitdown） | pipx |
| 数据科学 / Jupyter / CUDA | conda |
| 现代项目管理（含构建发布） | Hatch（自带项目管理）或 uv |
| 严格隔离 / 多 Python 版本快速切换 | DesireCore Hatch + venv |

## 常见误区

- ❌ `sudo pip install` —— 永远不要这样做
- ❌ 在系统 Python 上直接 `pip install` —— PEP 668 会拒绝
- ❌ 多个虚拟环境工具同时激活（venv + conda 嵌套）—— 路径会乱
- ❌ 把 venv 加入 git —— `.venv/` 应该在 `.gitignore` 里
