py-mirror-cli


Namepy-mirror-cli JSON
Version 0.1.0 PyPI version JSON
download
home_pageNone
SummaryPython pip 镜像源管理工具,类似 nrm
upload_time2025-10-10 15:40:54
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseNone
keywords pip pypi mirror registry manager
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # pyrm - Python pip 镜像源管理工具

[![Python](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)

`pyrm` (Python Registry Manager) 是一个命令行工具,用于管理 Python pip 的镜像源配置,类似于 Node.js 的 `nrm`。

## ✨ 特性

- 🚀 快速切换 pip 镜像源
- 📊 测试镜像源速度
- 🎨 美观的命令行界面(基于 Rich)
- 📝 可视化编辑 pip 配置文件(基于 Textual)
- 🔧 支持自定义镜像源
- 📦 支持项目级镜像源配置
- 🌍 内置国内常用镜像源

## 📦 安装

### 从 PyPI 安装(推荐)

```bash
pip install py-mirror-cli
```

安装完成后,使用 `pyrm` 命令即可。

### 从源码安装(开发环境)

```bash
# 克隆仓库
git clone https://github.com/yourusername/py-mirror-cli.git
cd py-mirror-cli

# 创建虚拟环境(可选但推荐)
python -m venv venv
source venv/bin/activate  # Linux/macOS
# 或 venv\Scripts\activate  # Windows

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

# 以开发模式安装
pip install -e .
```

### 从 PyPI 安装

```bash
pip install py-mirror-cli
```

安装完成后,使用 `pyrm` 命令即可。

## 🚀 快速开始

### 列出所有可用的镜像源

```bash
pyrm ls

# 或测试所有镜像源速度
pyrm ls --test
```

### 切换镜像源

```bash
# 切换到清华源
pyrm use tsinghua

# 切换到阿里云
pyrm use aliyun

# 切换全局镜像源(需要管理员权限)
pyrm use tsinghua --scope global

# 为当前项目设置镜像源
pyrm use tsinghua --scope local
```

### 查看当前使用的镜像源

```bash
pyrm current

# 查看项目级镜像源
pyrm current --scope local
```

### 测试镜像源速度

```bash
pyrm test

# 自定义超时时间
pyrm test --timeout 10
```

### 添加自定义镜像源

```bash
pyrm add myregistry https://my-registry.com/simple --desc "我的自定义镜像源"
```

### 删除自定义镜像源

```bash
# 交互式删除
pyrm del myregistry

# 强制删除(不需要确认)
pyrm del myregistry --force
```

### 虚拟环境级镜像源

```bash
# 先激活虚拟环境
source venv/bin/activate  # Linux/macOS
# venv\Scripts\activate   # Windows

# 为当前虚拟环境设置镜像源
pyrm local tsinghua

# 查看当前虚拟环境的镜像源
pyrm local
```

**注意:** `local` 命令需要在激活的虚拟环境中使用。pip 只支持虚拟环境级别的配置,不支持项目目录下的配置文件。

### 可视化编辑配置文件

```bash
# 编辑用户级配置
pyrm edit

# 编辑项目级配置
pyrm edit --scope local

# 编辑全局配置
pyrm edit --scope global
```

## 🎯 配置级别说明

pyrm 支持三个配置级别(优先级从高到低):

1. **local(虚拟环境级)** - 仅影响当前虚拟环境,需要先激活虚拟环境
2. **user(用户级)** - 影响当前用户的所有项目(默认)
3. **global(全局)** - 影响系统所有用户(需要管理员权限)

**重要:** `local` 级别实际上是虚拟环境级别,配置文件位于 `$VIRTUAL_ENV/pip.conf`(或 Windows 的 `pip.ini`)。pip 不支持项目目录下的配置文件。

## 📋 内置镜像源

| 名称 | URL | 说明 |
|------|-----|------|
| pypi | https://pypi.org/simple | Python 官方镜像源 |
| tsinghua | https://pypi.tuna.tsinghua.edu.cn/simple | 清华大学镜像源 |
| aliyun | https://mirrors.aliyun.com/pypi/simple | 阿里云镜像源 |
| tencent | https://mirrors.cloud.tencent.com/pypi/simple | 腾讯云镜像源 |
| douban | https://pypi.douban.com/simple | 豆瓣镜像源 |
| ustc | https://pypi.mirrors.ustc.edu.cn/simple | 中国科学技术大学镜像源 |
| huawei | https://repo.huaweicloud.com/repository/pypi/simple | 华为云镜像源 |

## 📖 命令详解

### `pyrm ls` - 列出镜像源

列出所有可用的镜像源,当前使用的镜像源会用 `*` 标记。

**选项:**
- `--test, -t`: 测试所有镜像源的速度

### `pyrm use <name>` - 切换镜像源

切换到指定的镜像源。

**参数:**
- `name`: 镜像源名称

**选项:**
- `--scope, -s`: 配置级别,可选 `user`(用户级,默认)、`global`(全局)、`local`(项目级)

### `pyrm current` - 显示当前镜像源

显示当前使用的镜像源信息。

**选项:**
- `--scope, -s`: 配置级别

### `pyrm test` - 测试镜像源速度

测试所有镜像源的响应速度,并按速度排序。

**选项:**
- `--timeout, -t`: 超时时间(秒),默认 5 秒

### `pyrm add <name> <url>` - 添加镜像源

添加自定义镜像源。

**参数:**
- `name`: 镜像源名称
- `url`: 镜像源 URL

**选项:**
- `--home`: 主页 URL
- `--desc, -d`: 描述信息

### `pyrm del <name>` - 删除镜像源

删除自定义镜像源(不能删除内置镜像源)。

**参数:**
- `name`: 镜像源名称

**选项:**
- `--force, -f`: 强制删除,不需要确认

### `pyrm local [name]` - 虚拟环境级镜像源

为当前虚拟环境设置或查看镜像源。

**参数:**
- `name`: 镜像源名称(可选,留空则显示当前虚拟环境镜像源)

**注意:** 此命令需要在激活的虚拟环境中使用。pip 只支持虚拟环境级别的配置,不支持项目目录下的配置文件。

**示例:**
```bash
# 先激活虚拟环境
source venv/bin/activate

# 为虚拟环境设置镜像源
pyrm local tsinghua

# 查看虚拟环境的镜像源
pyrm local
```

### `pyrm edit` - 可视化编辑配置

打开可视化编辑器编辑 pip 配置文件。

**选项:**
- `--scope, -s`: 配置级别

**编辑器快捷键:**
- `A`: 添加配置项
- `D`: 删除配置项
- `S`: 保存配置
- `R`: 重新加载配置
- `Q`: 退出编辑器

### `pyrm version` - 显示版本

显示 pyrm 的版本信息。

## 🔧 配置文件位置

### Linux/macOS

- 用户级: `~/.pip/pip.conf` 或 `~/.config/pip/pip.conf`
- 全局: `/etc/pip.conf` 或 `/Library/Application Support/pip/pip.conf`
- 虚拟环境级: `$VIRTUAL_ENV/pip.conf`

### Windows

- 用户级: `%USERPROFILE%\pip\pip.ini`
- 全局: `C:\ProgramData\pip\pip.ini`
- 虚拟环境级: `%VIRTUAL_ENV%\pip.ini`

## 💡 使用场景

### 场景 1: 快速切换到国内镜像源

在国内使用官方源速度较慢,可以快速切换到清华源:

```bash
pyrm use tsinghua
```

### 场景 2: 不同虚拟环境使用不同镜像源

某些项目需要使用特定镜像源,可以在虚拟环境中单独配置:

```bash
# 项目 A
cd project-a
python -m venv venv
source venv/bin/activate
pyrm local tsinghua

# 项目 B
cd ../project-b
python -m venv venv
source venv/bin/activate
pyrm local aliyun
```

### 场景 3: 找到最快的镜像源

测试所有镜像源的速度,选择最快的:

```bash
pyrm test
# 查看测试结果,选择最快的镜像源
pyrm use <fastest-registry>
```

### 场景 4: 添加公司内部镜像源

```bash
pyrm add company https://pypi.company.com/simple --desc "公司内部镜像源"
pyrm use company
```

## 🛠️ 开发

### 运行测试

```bash
pytest
```

### 代码格式化

```bash
black pyrm/
isort pyrm/
```

### 代码检查

```bash
flake8 pyrm/
```

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📄 License

[MIT License](LICENSE)

## 🙏 致谢

- 灵感来源于 Node.js 的 [nrm](https://github.com/Pana/nrm)
- 使用 [Typer](https://typer.tiangolo.com/) 构建 CLI
- 使用 [Rich](https://rich.readthedocs.io/) 美化终端输出
- 使用 [Textual](https://textual.textualize.io/) 构建 TUI 编辑器

## 📮 反馈

如有问题或建议,欢迎:
- 提交 [Issue](https://github.com/yourusername/py-mirror-cli/issues)
- 发送邮件至 jonelee@example.com

---

⭐ 如果这个项目对你有帮助,请给个星标支持一下!


            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "py-mirror-cli",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "pip, pypi, mirror, registry, manager",
    "author": null,
    "author_email": "Jonelee <jonelee@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/b7/74/b3a2383af0fa41bea14dd51dca69bfa143109324518f7d5b36c262bdd29f/py_mirror_cli-0.1.0.tar.gz",
    "platform": null,
    "description": "# pyrm - Python pip \u955c\u50cf\u6e90\u7ba1\u7406\u5de5\u5177\n\n[![Python](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n\n`pyrm` (Python Registry Manager) \u662f\u4e00\u4e2a\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u7528\u4e8e\u7ba1\u7406 Python pip \u7684\u955c\u50cf\u6e90\u914d\u7f6e\uff0c\u7c7b\u4f3c\u4e8e Node.js \u7684 `nrm`\u3002\n\n## \u2728 \u7279\u6027\n\n- \ud83d\ude80 \u5feb\u901f\u5207\u6362 pip \u955c\u50cf\u6e90\n- \ud83d\udcca \u6d4b\u8bd5\u955c\u50cf\u6e90\u901f\u5ea6\n- \ud83c\udfa8 \u7f8e\u89c2\u7684\u547d\u4ee4\u884c\u754c\u9762\uff08\u57fa\u4e8e Rich\uff09\n- \ud83d\udcdd \u53ef\u89c6\u5316\u7f16\u8f91 pip \u914d\u7f6e\u6587\u4ef6\uff08\u57fa\u4e8e Textual\uff09\n- \ud83d\udd27 \u652f\u6301\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\n- \ud83d\udce6 \u652f\u6301\u9879\u76ee\u7ea7\u955c\u50cf\u6e90\u914d\u7f6e\n- \ud83c\udf0d \u5185\u7f6e\u56fd\u5185\u5e38\u7528\u955c\u50cf\u6e90\n\n## \ud83d\udce6 \u5b89\u88c5\n\n### \u4ece PyPI \u5b89\u88c5\uff08\u63a8\u8350\uff09\n\n```bash\npip install py-mirror-cli\n```\n\n\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u4f7f\u7528 `pyrm` \u547d\u4ee4\u5373\u53ef\u3002\n\n### \u4ece\u6e90\u7801\u5b89\u88c5\uff08\u5f00\u53d1\u73af\u5883\uff09\n\n```bash\n# \u514b\u9686\u4ed3\u5e93\ngit clone https://github.com/yourusername/py-mirror-cli.git\ncd py-mirror-cli\n\n# \u521b\u5efa\u865a\u62df\u73af\u5883\uff08\u53ef\u9009\u4f46\u63a8\u8350\uff09\npython -m venv venv\nsource venv/bin/activate  # Linux/macOS\n# \u6216 venv\\Scripts\\activate  # Windows\n\n# \u5b89\u88c5\u4f9d\u8d56\npip install -r requirements.txt\n\n# \u4ee5\u5f00\u53d1\u6a21\u5f0f\u5b89\u88c5\npip install -e .\n```\n\n### \u4ece PyPI \u5b89\u88c5\n\n```bash\npip install py-mirror-cli\n```\n\n\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u4f7f\u7528 `pyrm` \u547d\u4ee4\u5373\u53ef\u3002\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u5217\u51fa\u6240\u6709\u53ef\u7528\u7684\u955c\u50cf\u6e90\n\n```bash\npyrm ls\n\n# \u6216\u6d4b\u8bd5\u6240\u6709\u955c\u50cf\u6e90\u901f\u5ea6\npyrm ls --test\n```\n\n### \u5207\u6362\u955c\u50cf\u6e90\n\n```bash\n# \u5207\u6362\u5230\u6e05\u534e\u6e90\npyrm use tsinghua\n\n# \u5207\u6362\u5230\u963f\u91cc\u4e91\npyrm use aliyun\n\n# \u5207\u6362\u5168\u5c40\u955c\u50cf\u6e90\uff08\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650\uff09\npyrm use tsinghua --scope global\n\n# \u4e3a\u5f53\u524d\u9879\u76ee\u8bbe\u7f6e\u955c\u50cf\u6e90\npyrm use tsinghua --scope local\n```\n\n### \u67e5\u770b\u5f53\u524d\u4f7f\u7528\u7684\u955c\u50cf\u6e90\n\n```bash\npyrm current\n\n# \u67e5\u770b\u9879\u76ee\u7ea7\u955c\u50cf\u6e90\npyrm current --scope local\n```\n\n### \u6d4b\u8bd5\u955c\u50cf\u6e90\u901f\u5ea6\n\n```bash\npyrm test\n\n# \u81ea\u5b9a\u4e49\u8d85\u65f6\u65f6\u95f4\npyrm test --timeout 10\n```\n\n### \u6dfb\u52a0\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\n\n```bash\npyrm add myregistry https://my-registry.com/simple --desc \"\u6211\u7684\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\"\n```\n\n### \u5220\u9664\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\n\n```bash\n# \u4ea4\u4e92\u5f0f\u5220\u9664\npyrm del myregistry\n\n# \u5f3a\u5236\u5220\u9664\uff08\u4e0d\u9700\u8981\u786e\u8ba4\uff09\npyrm del myregistry --force\n```\n\n### \u865a\u62df\u73af\u5883\u7ea7\u955c\u50cf\u6e90\n\n```bash\n# \u5148\u6fc0\u6d3b\u865a\u62df\u73af\u5883\nsource venv/bin/activate  # Linux/macOS\n# venv\\Scripts\\activate   # Windows\n\n# \u4e3a\u5f53\u524d\u865a\u62df\u73af\u5883\u8bbe\u7f6e\u955c\u50cf\u6e90\npyrm local tsinghua\n\n# \u67e5\u770b\u5f53\u524d\u865a\u62df\u73af\u5883\u7684\u955c\u50cf\u6e90\npyrm local\n```\n\n**\u6ce8\u610f\uff1a** `local` \u547d\u4ee4\u9700\u8981\u5728\u6fc0\u6d3b\u7684\u865a\u62df\u73af\u5883\u4e2d\u4f7f\u7528\u3002pip \u53ea\u652f\u6301\u865a\u62df\u73af\u5883\u7ea7\u522b\u7684\u914d\u7f6e\uff0c\u4e0d\u652f\u6301\u9879\u76ee\u76ee\u5f55\u4e0b\u7684\u914d\u7f6e\u6587\u4ef6\u3002\n\n### \u53ef\u89c6\u5316\u7f16\u8f91\u914d\u7f6e\u6587\u4ef6\n\n```bash\n# \u7f16\u8f91\u7528\u6237\u7ea7\u914d\u7f6e\npyrm edit\n\n# \u7f16\u8f91\u9879\u76ee\u7ea7\u914d\u7f6e\npyrm edit --scope local\n\n# \u7f16\u8f91\u5168\u5c40\u914d\u7f6e\npyrm edit --scope global\n```\n\n## \ud83c\udfaf \u914d\u7f6e\u7ea7\u522b\u8bf4\u660e\n\npyrm \u652f\u6301\u4e09\u4e2a\u914d\u7f6e\u7ea7\u522b\uff08\u4f18\u5148\u7ea7\u4ece\u9ad8\u5230\u4f4e\uff09\uff1a\n\n1. **local\uff08\u865a\u62df\u73af\u5883\u7ea7\uff09** - \u4ec5\u5f71\u54cd\u5f53\u524d\u865a\u62df\u73af\u5883\uff0c\u9700\u8981\u5148\u6fc0\u6d3b\u865a\u62df\u73af\u5883\n2. **user\uff08\u7528\u6237\u7ea7\uff09** - \u5f71\u54cd\u5f53\u524d\u7528\u6237\u7684\u6240\u6709\u9879\u76ee\uff08\u9ed8\u8ba4\uff09\n3. **global\uff08\u5168\u5c40\uff09** - \u5f71\u54cd\u7cfb\u7edf\u6240\u6709\u7528\u6237\uff08\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650\uff09\n\n**\u91cd\u8981\uff1a** `local` \u7ea7\u522b\u5b9e\u9645\u4e0a\u662f\u865a\u62df\u73af\u5883\u7ea7\u522b\uff0c\u914d\u7f6e\u6587\u4ef6\u4f4d\u4e8e `$VIRTUAL_ENV/pip.conf`\uff08\u6216 Windows \u7684 `pip.ini`\uff09\u3002pip \u4e0d\u652f\u6301\u9879\u76ee\u76ee\u5f55\u4e0b\u7684\u914d\u7f6e\u6587\u4ef6\u3002\n\n## \ud83d\udccb \u5185\u7f6e\u955c\u50cf\u6e90\n\n| \u540d\u79f0 | URL | \u8bf4\u660e |\n|------|-----|------|\n| pypi | https://pypi.org/simple | Python \u5b98\u65b9\u955c\u50cf\u6e90 |\n| tsinghua | https://pypi.tuna.tsinghua.edu.cn/simple | \u6e05\u534e\u5927\u5b66\u955c\u50cf\u6e90 |\n| aliyun | https://mirrors.aliyun.com/pypi/simple | \u963f\u91cc\u4e91\u955c\u50cf\u6e90 |\n| tencent | https://mirrors.cloud.tencent.com/pypi/simple | \u817e\u8baf\u4e91\u955c\u50cf\u6e90 |\n| douban | https://pypi.douban.com/simple | \u8c46\u74e3\u955c\u50cf\u6e90 |\n| ustc | https://pypi.mirrors.ustc.edu.cn/simple | \u4e2d\u56fd\u79d1\u5b66\u6280\u672f\u5927\u5b66\u955c\u50cf\u6e90 |\n| huawei | https://repo.huaweicloud.com/repository/pypi/simple | \u534e\u4e3a\u4e91\u955c\u50cf\u6e90 |\n\n## \ud83d\udcd6 \u547d\u4ee4\u8be6\u89e3\n\n### `pyrm ls` - \u5217\u51fa\u955c\u50cf\u6e90\n\n\u5217\u51fa\u6240\u6709\u53ef\u7528\u7684\u955c\u50cf\u6e90\uff0c\u5f53\u524d\u4f7f\u7528\u7684\u955c\u50cf\u6e90\u4f1a\u7528 `*` \u6807\u8bb0\u3002\n\n**\u9009\u9879\uff1a**\n- `--test, -t`: \u6d4b\u8bd5\u6240\u6709\u955c\u50cf\u6e90\u7684\u901f\u5ea6\n\n### `pyrm use <name>` - \u5207\u6362\u955c\u50cf\u6e90\n\n\u5207\u6362\u5230\u6307\u5b9a\u7684\u955c\u50cf\u6e90\u3002\n\n**\u53c2\u6570\uff1a**\n- `name`: \u955c\u50cf\u6e90\u540d\u79f0\n\n**\u9009\u9879\uff1a**\n- `--scope, -s`: \u914d\u7f6e\u7ea7\u522b\uff0c\u53ef\u9009 `user`\uff08\u7528\u6237\u7ea7\uff0c\u9ed8\u8ba4\uff09\u3001`global`\uff08\u5168\u5c40\uff09\u3001`local`\uff08\u9879\u76ee\u7ea7\uff09\n\n### `pyrm current` - \u663e\u793a\u5f53\u524d\u955c\u50cf\u6e90\n\n\u663e\u793a\u5f53\u524d\u4f7f\u7528\u7684\u955c\u50cf\u6e90\u4fe1\u606f\u3002\n\n**\u9009\u9879\uff1a**\n- `--scope, -s`: \u914d\u7f6e\u7ea7\u522b\n\n### `pyrm test` - \u6d4b\u8bd5\u955c\u50cf\u6e90\u901f\u5ea6\n\n\u6d4b\u8bd5\u6240\u6709\u955c\u50cf\u6e90\u7684\u54cd\u5e94\u901f\u5ea6\uff0c\u5e76\u6309\u901f\u5ea6\u6392\u5e8f\u3002\n\n**\u9009\u9879\uff1a**\n- `--timeout, -t`: \u8d85\u65f6\u65f6\u95f4\uff08\u79d2\uff09\uff0c\u9ed8\u8ba4 5 \u79d2\n\n### `pyrm add <name> <url>` - \u6dfb\u52a0\u955c\u50cf\u6e90\n\n\u6dfb\u52a0\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\u3002\n\n**\u53c2\u6570\uff1a**\n- `name`: \u955c\u50cf\u6e90\u540d\u79f0\n- `url`: \u955c\u50cf\u6e90 URL\n\n**\u9009\u9879\uff1a**\n- `--home`: \u4e3b\u9875 URL\n- `--desc, -d`: \u63cf\u8ff0\u4fe1\u606f\n\n### `pyrm del <name>` - \u5220\u9664\u955c\u50cf\u6e90\n\n\u5220\u9664\u81ea\u5b9a\u4e49\u955c\u50cf\u6e90\uff08\u4e0d\u80fd\u5220\u9664\u5185\u7f6e\u955c\u50cf\u6e90\uff09\u3002\n\n**\u53c2\u6570\uff1a**\n- `name`: \u955c\u50cf\u6e90\u540d\u79f0\n\n**\u9009\u9879\uff1a**\n- `--force, -f`: \u5f3a\u5236\u5220\u9664\uff0c\u4e0d\u9700\u8981\u786e\u8ba4\n\n### `pyrm local [name]` - \u865a\u62df\u73af\u5883\u7ea7\u955c\u50cf\u6e90\n\n\u4e3a\u5f53\u524d\u865a\u62df\u73af\u5883\u8bbe\u7f6e\u6216\u67e5\u770b\u955c\u50cf\u6e90\u3002\n\n**\u53c2\u6570\uff1a**\n- `name`: \u955c\u50cf\u6e90\u540d\u79f0\uff08\u53ef\u9009\uff0c\u7559\u7a7a\u5219\u663e\u793a\u5f53\u524d\u865a\u62df\u73af\u5883\u955c\u50cf\u6e90\uff09\n\n**\u6ce8\u610f\uff1a** \u6b64\u547d\u4ee4\u9700\u8981\u5728\u6fc0\u6d3b\u7684\u865a\u62df\u73af\u5883\u4e2d\u4f7f\u7528\u3002pip \u53ea\u652f\u6301\u865a\u62df\u73af\u5883\u7ea7\u522b\u7684\u914d\u7f6e\uff0c\u4e0d\u652f\u6301\u9879\u76ee\u76ee\u5f55\u4e0b\u7684\u914d\u7f6e\u6587\u4ef6\u3002\n\n**\u793a\u4f8b\uff1a**\n```bash\n# \u5148\u6fc0\u6d3b\u865a\u62df\u73af\u5883\nsource venv/bin/activate\n\n# \u4e3a\u865a\u62df\u73af\u5883\u8bbe\u7f6e\u955c\u50cf\u6e90\npyrm local tsinghua\n\n# \u67e5\u770b\u865a\u62df\u73af\u5883\u7684\u955c\u50cf\u6e90\npyrm local\n```\n\n### `pyrm edit` - \u53ef\u89c6\u5316\u7f16\u8f91\u914d\u7f6e\n\n\u6253\u5f00\u53ef\u89c6\u5316\u7f16\u8f91\u5668\u7f16\u8f91 pip \u914d\u7f6e\u6587\u4ef6\u3002\n\n**\u9009\u9879\uff1a**\n- `--scope, -s`: \u914d\u7f6e\u7ea7\u522b\n\n**\u7f16\u8f91\u5668\u5feb\u6377\u952e\uff1a**\n- `A`: \u6dfb\u52a0\u914d\u7f6e\u9879\n- `D`: \u5220\u9664\u914d\u7f6e\u9879\n- `S`: \u4fdd\u5b58\u914d\u7f6e\n- `R`: \u91cd\u65b0\u52a0\u8f7d\u914d\u7f6e\n- `Q`: \u9000\u51fa\u7f16\u8f91\u5668\n\n### `pyrm version` - \u663e\u793a\u7248\u672c\n\n\u663e\u793a pyrm \u7684\u7248\u672c\u4fe1\u606f\u3002\n\n## \ud83d\udd27 \u914d\u7f6e\u6587\u4ef6\u4f4d\u7f6e\n\n### Linux/macOS\n\n- \u7528\u6237\u7ea7: `~/.pip/pip.conf` \u6216 `~/.config/pip/pip.conf`\n- \u5168\u5c40: `/etc/pip.conf` \u6216 `/Library/Application Support/pip/pip.conf`\n- \u865a\u62df\u73af\u5883\u7ea7: `$VIRTUAL_ENV/pip.conf`\n\n### Windows\n\n- \u7528\u6237\u7ea7: `%USERPROFILE%\\pip\\pip.ini`\n- \u5168\u5c40: `C:\\ProgramData\\pip\\pip.ini`\n- \u865a\u62df\u73af\u5883\u7ea7: `%VIRTUAL_ENV%\\pip.ini`\n\n## \ud83d\udca1 \u4f7f\u7528\u573a\u666f\n\n### \u573a\u666f 1: \u5feb\u901f\u5207\u6362\u5230\u56fd\u5185\u955c\u50cf\u6e90\n\n\u5728\u56fd\u5185\u4f7f\u7528\u5b98\u65b9\u6e90\u901f\u5ea6\u8f83\u6162\uff0c\u53ef\u4ee5\u5feb\u901f\u5207\u6362\u5230\u6e05\u534e\u6e90\uff1a\n\n```bash\npyrm use tsinghua\n```\n\n### \u573a\u666f 2: \u4e0d\u540c\u865a\u62df\u73af\u5883\u4f7f\u7528\u4e0d\u540c\u955c\u50cf\u6e90\n\n\u67d0\u4e9b\u9879\u76ee\u9700\u8981\u4f7f\u7528\u7279\u5b9a\u955c\u50cf\u6e90\uff0c\u53ef\u4ee5\u5728\u865a\u62df\u73af\u5883\u4e2d\u5355\u72ec\u914d\u7f6e\uff1a\n\n```bash\n# \u9879\u76ee A\ncd project-a\npython -m venv venv\nsource venv/bin/activate\npyrm local tsinghua\n\n# \u9879\u76ee B\ncd ../project-b\npython -m venv venv\nsource venv/bin/activate\npyrm local aliyun\n```\n\n### \u573a\u666f 3: \u627e\u5230\u6700\u5feb\u7684\u955c\u50cf\u6e90\n\n\u6d4b\u8bd5\u6240\u6709\u955c\u50cf\u6e90\u7684\u901f\u5ea6\uff0c\u9009\u62e9\u6700\u5feb\u7684\uff1a\n\n```bash\npyrm test\n# \u67e5\u770b\u6d4b\u8bd5\u7ed3\u679c\uff0c\u9009\u62e9\u6700\u5feb\u7684\u955c\u50cf\u6e90\npyrm use <fastest-registry>\n```\n\n### \u573a\u666f 4: \u6dfb\u52a0\u516c\u53f8\u5185\u90e8\u955c\u50cf\u6e90\n\n```bash\npyrm add company https://pypi.company.com/simple --desc \"\u516c\u53f8\u5185\u90e8\u955c\u50cf\u6e90\"\npyrm use company\n```\n\n## \ud83d\udee0\ufe0f \u5f00\u53d1\n\n### \u8fd0\u884c\u6d4b\u8bd5\n\n```bash\npytest\n```\n\n### \u4ee3\u7801\u683c\u5f0f\u5316\n\n```bash\nblack pyrm/\nisort pyrm/\n```\n\n### \u4ee3\u7801\u68c0\u67e5\n\n```bash\nflake8 pyrm/\n```\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n## \ud83d\udcc4 License\n\n[MIT License](LICENSE)\n\n## \ud83d\ude4f \u81f4\u8c22\n\n- \u7075\u611f\u6765\u6e90\u4e8e Node.js \u7684 [nrm](https://github.com/Pana/nrm)\n- \u4f7f\u7528 [Typer](https://typer.tiangolo.com/) \u6784\u5efa CLI\n- \u4f7f\u7528 [Rich](https://rich.readthedocs.io/) \u7f8e\u5316\u7ec8\u7aef\u8f93\u51fa\n- \u4f7f\u7528 [Textual](https://textual.textualize.io/) \u6784\u5efa TUI \u7f16\u8f91\u5668\n\n## \ud83d\udcee \u53cd\u9988\n\n\u5982\u6709\u95ee\u9898\u6216\u5efa\u8bae\uff0c\u6b22\u8fce\uff1a\n- \u63d0\u4ea4 [Issue](https://github.com/yourusername/py-mirror-cli/issues)\n- \u53d1\u9001\u90ae\u4ef6\u81f3 jonelee@example.com\n\n---\n\n\u2b50 \u5982\u679c\u8fd9\u4e2a\u9879\u76ee\u5bf9\u4f60\u6709\u5e2e\u52a9\uff0c\u8bf7\u7ed9\u4e2a\u661f\u6807\u652f\u6301\u4e00\u4e0b\uff01\n\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "Python pip \u955c\u50cf\u6e90\u7ba1\u7406\u5de5\u5177\uff0c\u7c7b\u4f3c nrm",
    "version": "0.1.0",
    "project_urls": {
        "Homepage": "https://github.com/yourusername/py-mirror-cli",
        "Repository": "https://github.com/yourusername/py-mirror-cli"
    },
    "split_keywords": [
        "pip",
        " pypi",
        " mirror",
        " registry",
        " manager"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "ab824976093f3b077297a86975eda4e4680e700e9725c2cda5b31691841f7634",
                "md5": "b242a7f6f729b2ff370daccf38763046",
                "sha256": "68e16d6049c10664fb20ee11af7de962bf5e402a700692080ce294a13e392dbe"
            },
            "downloads": -1,
            "filename": "py_mirror_cli-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "b242a7f6f729b2ff370daccf38763046",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 17902,
            "upload_time": "2025-10-10T15:40:52",
            "upload_time_iso_8601": "2025-10-10T15:40:52.149693Z",
            "url": "https://files.pythonhosted.org/packages/ab/82/4976093f3b077297a86975eda4e4680e700e9725c2cda5b31691841f7634/py_mirror_cli-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "b774b3a2383af0fa41bea14dd51dca69bfa143109324518f7d5b36c262bdd29f",
                "md5": "92afbb9198724ca1e58502e31fc8328d",
                "sha256": "cb714309261983dca5f1995df0c62a7c5775284fa3f212c810462c0b00526d27"
            },
            "downloads": -1,
            "filename": "py_mirror_cli-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "92afbb9198724ca1e58502e31fc8328d",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 17112,
            "upload_time": "2025-10-10T15:40:54",
            "upload_time_iso_8601": "2025-10-10T15:40:54.392925Z",
            "url": "https://files.pythonhosted.org/packages/b7/74/b3a2383af0fa41bea14dd51dca69bfa143109324518f7d5b36c262bdd29f/py_mirror_cli-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-10-10 15:40:54",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "py-mirror-cli",
    "github_not_found": true,
    "lcname": "py-mirror-cli"
}
        
Elapsed time: 0.73826s