win10: 搭建本地pip镜像源

前言:

        windows下和linux下都可以搭建本地pip镜像源。操作流程上一样,但是细节上存在一些差异。建议在linux上搭建本地镜像,流程简单很多。在windows系统上,会在多个地方存在问题(比如不识别.symlink文件,一些python包的命名不识别),报错并需要修改。个人因为在两个系统上都搭建过了,所以记录一下。

        这里仅仅对下载得到pypi的package之后的mirror发布进行细节介绍,如何下载pypi的镜像文件,我在文末进行了介绍。

一、准备工作

我把所有需要用到的文件都已经打包,大家可以自行下载。

链接:https://pan.baidu.com/s/1xXAonud7NnkpLWM7ExI-bg 
提取码:8yvn

1. 创建工作目录

创建一个新的文件夹:build_pypi_mirror,后续所有的操作都在这个文件夹下进行。

2. 创建一个新的python虚拟环境 

        为每一个工程创建一个独立的虚拟环境是一个好习惯,可以保证项目环境的纯洁性,避免出现package版本冲突。

        创建虚拟环境

python -m venv ./virtual_env

        激活虚拟环境:

./virtual_env/Scripts/activate

        安装pip2pi包

pip install pip2pi-*.whl

 3. 整理pypi安装包

        我已经把一些示例包都准备好了,大家直接使用即可。把下载文件中的pypi-packages文件夹放置到build_pypi_mirror目录下。

二. 执行dir2pi命令,生成simple文件夹

1. 生成simple文件夹

        以管理员身份打开cmd命令行终端,进入build_pypi_mirror文件夹,执行以下命令,

dir2pi ./pypi-packages

 该命令会在pypi-packages文件夹下生成一个simple文件夹。 

       说明:

  • dir2pi函数是pip2pi包中自带的,不需要额外安装。
  • 在windows下运行,建议“以管理员身份”命令行,否则会报错。原因:dir2pi 过程中会产生“.symlink”文件,而windows不识别“.symlink”文件,当产生“.symlink”文件时,命令行终端会报警,除非以管理员身份运行。(其实,不用管理员身份运行也可以,因为产生的“.symlink”文件用不着,仅仅是cmd界面的观感不太好。)

2. 修改simple中的文件内容 

        dir2pi命令的返回结果是为linux系统准备的,比如上面的".symlink"文件,在linux系统中可以识别,但是在windows系统下不能识别也不能使用。这导致,在windows系统下生成的simple文件夹中的index文件需要进行修改。

        修改的目的是:在通过index文件寻找pypi数据包时,不通过".symlink"文件作为中转站,而是直接寻找pypi数据包原件。

        修改的内容是:在每一个index.html文件内的pypi数据包路径前面,加上“../../”,如下:

        修改前:
在这里插入图片描述

        修改后:
在这里插入图片描述

        通过代码批量化修改: 

我已经把批量修改的代码放在了第一步的打包文件中,其内容如下:

reformat_index.py

import os 
import glob
 
class Class_Util_Text():
    def __init__(self):
        pass
 
    def read_text(self,text_path):
        """
        读取本地text文件到列表,并返回该列表
        """
        assert os.path.exists(text_path)
        with open(text_path,"r") as f:
            lines=f.readlines() #读行
        return lines
 
    def write_text(self,text_path,text_content):
        """
        把文字写入文本文件中,会清空文本文件的原有内容
        """
        with open(text_path,"w") as f:
            f.writelines(text_content)
            f.writelines("\n")
 
    def append_text(self,text_path,text_content):
        """
        把文字添加到文本文件的末尾,保留原文本文件内容
        """
        with open(text_path,"a") as f:
            f.writelines(text_content)
            f.writelines("\n")
 
    def replace_text(self,text_path,replace_old,replace_new):
        """
        替换文本文件中的部分文字,先读文件,替换文字后,再重新写入文件
        """
        #read
        with open(text_path,"r") as f:
            lines=f.readlines() 
            data=[]  
            for i in lines:
                #根据条件修改
                if(replace_old in i):
                    i=i.replace(replace_old,replace_new)   #修改 replace_old 为 replace_new
                data.append(i)     #记录每一行      
        #write
        with open(text_path,"w") as f:
            for i in data:
                f.writelines(i)
 
 
 
if __name__ =="__main__":
    txt_obj = Class_Util_Text()
    dir_path = "D:\pypi-packages\simple"  ## 只需要修改这里即可

    html_files = glob.glob(dir_path+"/*/index.html")
 
    for html_path in html_files:
        txt_obj.replace_text(html_path,replace_old="<a href='",replace_new="<a href='../../" )
        # txt_obj.replace_text(html_path,replace_old="<a href='../../",replace_new="<a href='" )
        lines = txt_obj.read_text(html_path)
        print(html_path)
        print(lines)

 三、发布镜像源

        为了让浏览器或pip程序可以访问这个镜像库,需要把第二步中产生的simple文件夹发布到互联网/局域网中。这里主要介绍两种方式:

        方式1:用python创建server服务

python -m http.server 8080 --bind 168.163.1.1 --directory D:/your_path_to_simple_dir

        参数说明:

  •         8080是自己设置的网络端口,可以自行修改
  •         --bind:绑定你的机器的ip地址,后面的地址是你的电脑IP。这个命令可以省略。
  •         --directory: 指定要暴露哪个文件夹
1)浏览器访问镜像库:

        在浏览器中输入: Your_IP:Your_Port (比如:168.163.10.0:8080) 即可访问你自己创建的镜像源了,点击之后可以下载相关python包。

2)pip使用镜像库:

        要pip命令访问自己创建的pypi镜像库,需要修改pip命令的默认搜索路径。

        打开命令行终端,对pip命令进行以下设置:

# 设置默认搜索路径
pip config set global.index-url http://168.163.1.1:8080 

# 设置对IP的信任--不设置会报错
pip config set install.trusted-host 168.163.1.1
3)评价:

        该方式很简单,但是需要一个额外的cmd窗口来维持对镜像源的发布,不能关闭。虽然实现简单,但是维护有些麻烦,因此推荐方法2.

方法2:用nginx发布

下载安装nginx,修改nginx.conf(总共修改三个位置,如下):

server{
    listen        8080;  # 1.修改位置1:设置端口
    server_name     168.163.1.1;  # 2.修改位置2:输入你的电脑IP。
    access_log     logs/pip.log;
    location / {
            root D:/build_pypi_mirror/pypi_packages/simple; # 3.修改位置3--设置html文件的搜索路径
            autoindex on;
            autoindex_exact_size off;
            autoindex_localtime on;
    }
}

修改完成后,双击执行nginx.exe启动nginx。

1)浏览器访问镜像库。

        完成以上操作,就可以用浏览器打开168.163.1.1:8080访问simple文件夹,并可以通过鼠标点击,下载python包了。

2)pip使用镜像库

        这里对pip的设置与方式1中的设置方式完全相同。只是重复一遍:

        打开命令行终端,对pip命令进行以下设置:

# 设置默认搜索路径
pip config set global.index-url http://168.163.1.1:8080 

# 设置对IP的信任--不设置会报错
pip config set install.trusted-host 168.163.1.1
3)评价:

        nginx方式需要再安装一个nginx软件。这个过程可能稍显麻烦。但是他的好处是,双击运行nginx后就不用再管了,其在后台运行,不存在一个命令行窗口提示自己不能关掉。 

四、其他机器使用该镜像库

        通过第三步的设置,自己的镜像源已经发布在了互联网/局域网中,任何与该电脑相连接的互联网/局域网设备,都可以上面的ip地址和端口号访问这个镜像了。

        每个机器只需要修改pip的配置即可。这里把配置信息再赘述一遍:

        打开命令行终端,对pip命令进行以下设置:

# 设置默认搜索路径
pip config set global.index-url http://168.163.1.1:8080 

# 设置对IP的信任--不设置会报错
pip config set install.trusted-host 168.163.1.1

五、 下载清华镜像源

        以上过程仅仅完成了原理验证,现在只需要下载整个pypi镜像源,然后重新执行以上步骤就可以了。

1. 获取清华pypi镜像源的requirements.txt (大概有几个G)

     prepare_pypi_requirements.py

import requests
import re
report = requests.request('get','https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/')
# print(report.text)
text_str = str(report.text).split('\n')
with open('requirement.txt','w+') as f:
    for i in text_str:
        temp = re.findall('<a href="(.*?)/">',i)
        # print(i,temp)
        if temp != []:
            f.write(str(temp[0])+'\n')
 

2. 根据requirements.txt从清华镜像源下载pypi数据包--大概12T左右 

        download_pypi.py

#!/bin/bash
import os
file="C:\\software\\package\\requirement.txt"
 
with open(file,'r+') as f:
    text = f.readlines()
    for i in text:
        os.mkdir('C:\\software\\package\\'+i[:-1])
        os.system('pip download '+i[:-1]+' -i https://pypi.tuna.tsinghua.edu.cn/simple -d '+'C:\\software\\package\\'+i[:-1])

六. 尾言

         当对整个清华pypi镜像源进行 dir2pi 操作时,会出现多次报错。主要原因是,有的python包的命名格式不符合windows的要求。此时,需要把这些命名不符合windows规范的包删除掉,才能正常完成dir2pi操作。这些包有很多,虽然有一些规律,但是仍旧是一个很繁琐的工作。因此,极力不推荐在windows系统上布置pypi镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/274067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】索引特性

文章目录 一、索引的概念二、MySQL与磁盘三、索引的理解观察主键索引现象推导主键索引结构的构建索引结构可以采用的数据结构聚簇索引 VS 非聚簇索引 四、索引操作创建主键索引创建唯一索引创建普通索引创建全文索引查询索引删除索引索引创建原则 一、索引的概念 数据库表中存…

PostgreSQL | FunctionProcedure | 函数与存储过程的区别

文章目录 PostgreSQL | Function&Procedure | 函数与存储过程的区别1. 简述书面说法大白话讲 2. 函数&#xff08;Function&#xff09;2.1 定义2.2 用途2.3 执行2.4 事务处理2.5 说点例子1. 当参数都是IN类时2. 参数中出现OUT、INOUT参数时 3. 存储过程&#xff08;Proced…

【Java】工业园区高精准UWB定位系统源码

UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。UWB定位系统依托在移动通信&#xff0c;雷达&#xff0c;微波电路&#xff0c;云计算与大数据…

02之Python运算符与if结构

Day02之Python运算符与if结构 一、昨日回顾 1、回顾昨天的课程内容 略 2、回顾昨天的作业 定义变量&#xff0c;c1 ‘可乐’&#xff0c;c2 ‘牛奶’&#xff0c;通过Python代码把c1内容调整为牛奶&#xff0c;c2调整为可乐。 # 1、定义两个变量 c1 可乐 c2 牛奶# 2、…

以源码为驱动:Java版工程项目管理系统平台助力工程企业迈向数字化管理的巅峰

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1&#xff09;物理备份 物理备份&#xff1a;对数据库操作系统的物理文件&#xff08;如数据文件、日志文件等&#xff09;的备份。 物理备份方法&#xff1a; 冷备份(脱机备份) &#xff1a;是在关闭数据库的时候进…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

Java 对象内存布局

在虚拟机中&#xff0c;Java对象在内存中的布局可以分为三块&#xff1a; 对象头&#xff08;Header&#xff09; &#xff1a;包含 markword 标记字段和类型指针&#xff0c;32 位上大小是 8 个字节&#xff0c;64 位 16 个字节&#xff0c;实例数据&#xff08;Instance Dat…

特殊求和(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

LeetCode206反转链表(java实现)

今天带来的题目解析是leetcode206&#xff0c;反转链表&#xff0c;我们来看下题目描述 如何实现链表的反转呢&#xff1f;我在这里提供的思路是双指针的思路。 具体的思路如下&#xff1a; 假设我们的原链表如下 首先定义一个指针pre&#xff0c;用于指向head之前的位置&am…

浮点数(float)与整型数(int)的转换

1.浮点数&#xff08;float/double&#xff09;转整型数&#xff08;int&#xff09;——向零舍入 假设定义float a1.3,b1.6,c2.0; int aa,bb,cc; 使用强制转换aa(int)a;bb(int)b;cc(int)c;结果aa1;bb1;cc2; 在处理时为了四舍五入&#xff0c;aa(int)(a0.5);bb(int)(b0.5);…

Kafka、RocketMQ、RabbitMQ消息丢失可能存在的地方,以及解决方案

这里主要对比&#xff1a;Kafka、RocketMQ、RabbitMQ 介绍一下消息生产、存储、消费三者的架构形式。 消息丢失可能存在的场景&#xff1a; 情况一&#xff1a; 生产者发送给MQ的过程消息丢失 在写消息的过程中因为网络的原因&#xff0c;还没到mq消息就丢失了&#xff1b;或…

为什么要运营海外社媒?海外云手机能发挥什么作用?

基于海外社媒在全球范围内拥有的大量流量&#xff0c;海外社媒运营成为了品牌推广、内容创作和用户互动的重要途径。本文将探讨海外社媒运营的重要性&#xff0c;并介绍海外云手机在这一过程中的卓越帮助。 海外社媒运营的重要性 首先&#xff0c;海外社媒运营有助于企业扩大品…

搭建Vue前端项目的流程

1、安装nodejs 测试安装是否成功 $ npm -v 6.14.16 $ node -v v12.22.122、全局安装npm install -g vue/cli&#xff0c;后续会使用到vue命令 $ vue --version vue/cli 5.0.8使用vue create demo_project_fe命令创建项目&#xff0c;使用箭头键来选择&#xff0c;确认使用回车…

Linux内核中断

Linux内核中断 ARM里当按下按键的时候&#xff0c;他首先会执行汇编文件start.s里面的异常向量表里面的irq,在irq里面进行一些操作。 再跳转到C的do_irq(); 进行操作&#xff1a;1&#xff09;判断中断的序号&#xff1b;2&#xff09;处理中断&#xff1b;3&#xff09;清除中…

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网&#xff0c;链接&#xff1a;Get Your Educational Tool - JetBrains 第二步 选择下拉框&#xff0c;根据自己的电脑芯片选择下载版本&#xff08;芯片查看位置&#xff1a;设置-通用-关于本机&#xff09;然后点击Download按钮 ​​​​​​​ -- 第…

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基础概念、思维习惯、知识图谱

说明&#xff1a; 刚开始写本文&#xff0c;因为本文涉及的内容会很多&#xff0c;部分内容要写清楚不容易&#xff0c;所以提前声明&#xff0c;现在只是第一阶段&#xff0c;先收集零散的内容&#xff0c;第二阶段再大刀阔斧地重构目录。 一&#xff0c;基础概念 1&#xf…

win桌面圣诞小插件分享

最终效果 文章目录 最终效果前言下载效果更多完结 前言 圣诞到了&#xff0c;最近有小伙伴问我有没有一些桌面圣诞小插件可以分享一下&#xff0c;所以我就特地去寻找了一些&#xff0c;感觉效果还不错&#xff0c;所以分享出来 下载 链接&#xff1a;https://pan.baidu.com…

css 设置鼠标覆盖显示菜单

鼠标覆盖到“全部分类”效果如下 鼠标放到“精品推荐”效果如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…