从“龟速”下载到“极速”安装:一个PyPI镜像切换工具的故事


作为一名开发者,我经常会使用 pip来安装各种Python包。pip很多时候龟速下载令人抓狂,国内有很多可靠的PyPI镜像,比如清华大学的TUNA、阿里云的镜像等。这些镜像不仅内容丰富,而且下载速度极快。然而,每次切换镜像都需要手动修改 pip的配置文件,这显然不够高效。花了点时间写了个简单小工具。

工具的效果

这个小工具的核心功能是让开发者通过一个简单的命令行交互界面,快速切换PyPI镜像。以下是它的主要功能:

  1. 镜像选择:工具提供了一个直观的选择菜单,列出了几个常用的PyPI镜像源,包括清华、豆瓣、中科大、阿里云和官方源。

  2. 自动配置:用户选择镜像后,工具会自动调用pip config命令,修改pip的全局配置,将index-url设置为所选镜像的地址。

  3. 当前配置显示:在切换镜像后,工具还会显示当前的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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值