作为一名开发者,我经常会使用
pip
来安装各种Python包。pip很多时候龟速下载令人抓狂,国内有很多可靠的PyPI镜像,比如清华大学的TUNA、阿里云的镜像等。这些镜像不仅内容丰富,而且下载速度极快。然而,每次切换镜像都需要手动修改
pip
的配置文件,这显然不够高效。花了点时间写了个简单小工具。
工具的效果
这个小工具的核心功能是让开发者通过一个简单的命令行交互界面,快速切换PyPI镜像。以下是它的主要功能:
-
镜像选择:工具提供了一个直观的选择菜单,列出了几个常用的PyPI镜像源,包括清华、豆瓣、中科大、阿里云和官方源。
-
自动配置:用户选择镜像后,工具会自动调用
pip config
命令,修改pip
的全局配置,将index-url
设置为所选镜像的地址。 -
当前配置显示:在切换镜像后,工具还会显示当前的
pip
配置,确保配置已经成功生效。
使用这个小工具后,开发者不再需要手动修改配置文件,只需简单的几步操作,就能轻松切换到最快的镜像源,极大地提高了开发和部署的效率。
效果图
代码实现
为了简便,选择go作为开发语言
package main
import (
"fmt"
"os/exec"
"github.com/AlecAivazis/survey/v2"
)
var mirrors = map[string]string{
"TUNA": "https://pypi.tuna.tsinghua.edu.cn/simple",
"Douban": "https://pypi.douban.com/simple/",
"USTC": "https://pypi.mirrors.ustc.edu.cn/simple",
"Aliyun": "http://mirrors.aliyun.com/pypi/simple/",
"Pypi": "https://pypi.org/simple",
}
func main() {
var selectedMirror string
prompt := &survey.Select{
Message: "Select a PyPI mirror:",
Options: []string{"TUNA", "Douban", "USTC", "Aliyun", "Pypi"},
}
err := survey.AskOne(prompt, &selectedMirror)
if err != nil {
fmt.Printf("Failed to select mirror: %v\n", err)
return
}
url, exists := mirrors[selectedMirror]
if !exists {
fmt.Println("Invalid mirror name")
return
}
err = setPipIndexUrl(url)
if err != nil {
fmt.Printf("Failed to set pip index URL: %v\n", err)
return
}
fmt.Printf("Successfully set the PyPI mirror to %s\n", url)
currentUrl, err := getCurrentPipIndexUrl()
if err != nil {
fmt.Printf("Failed to get current pip index URL: %v\n", err)
return
}
fmt.Printf("Current pip index URL is: %s\n", currentUrl)
}
func setPipIndexUrl(url string) error {
cmd := exec.Command("pip", "config", "set", "global.index-url", url)
output, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("%v: %s", err, output)
}
return nil
}
func getCurrentPipIndexUrl() (string, error) {
cmd := exec.Command("pip", "config", "get", "global.index-url")
output, err := cmd.CombinedOutput()
if err != nil {
return "", fmt.Errorf("%v: %s", err, output)
}
return string(output), nil
}