使用pip2pi和nginx搭建私有pip镜像源方法

在内网环境下部署python开发环境,安装python第三方库比较麻烦,特别是安装需要多个依赖的库。一种比较好的解决方案是搭建一个本地的私有pip镜像源,有多个方案可以选择,比如pypiserver、pip2pi等,本文介绍使用python的pip2pi库,搭配nginx来搭建pip镜像源的方法。

目录

  • 1 搭建环境
  • 2 pip2pi安装
  • 3 python包下载
  • 4 创建索引
  • 5 nginx安装配置
    • 5.1 nginx安装
    • 5.2 nginx配置
  • 6 使用本地镜像源

1 搭建环境

Windows和Linux系统上都可以使用pip2pi来搭建pip镜像源,本文介绍在Linux上的部署方法,Windows系统类似。

使用的Linux发行版本为centos7:

$ uname -a
Linux Server 3.10.0-1160.114.2.el7.x86_64 #1 SMP Wed Mar 20 15:54:52 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

另外需要安装一下python环境,本文使用的python版本为3.10.11,安装编译方法可参考Python环境配置以及包管理方法详细介绍。

2 pip2pi安装

使用pip命令安装:

pip3 install pip2pi

离线环境可先到有网的环境下载whl包:https://pypi.org/project/pip2pi/#files

然后离线安装:

$ pip3 install pip2pi-0.8.2-py2.py3-none-any.whl        

3 python包下载

在本地部署pypi源需要将python库下载到本地然后对其进行索引,因此库文件是很关键的,然而当前pypi官方源有巨量的python库文件,需要大量的空间(几十T)。如果你有足够的磁盘空间可以到pip国内镜像源下载。

实际使用中大多数python库用不上,仅下载团队项目开发所需要的那些库即可。

可使用pip download命令下载所需的包,具体下载方法参考Python环境配置以及包管理方法详细介绍

4 创建索引

将下载的python安装包放到/home/pythonlibs目录下,然后执行如下命令创建索引:

$ dir2pi /home/pythonlibs

执行成功后,/home/pythonlibs目录下会创建一个simple目录,对库文件进行了索引:

├── simple
│   ├── aerich
│   │   ├── aerich-0.7.2-py3-none-any.whl -> ../../aerich-0.7.2-py3-none-any.whl
│   │   └── index.html
│   ├── aiofiles
│   │   ├── aiofiles-0.5.0-py3-none-any.whl -> ../../aiofiles-0.5.0-py3-none-any.whl
│   │   └── index.html
...

比如aerich库的index.html内容为:

<a href='aerich-0.7.2-py3-none-any.whl'>aerich-0.7.2-py3-none-any.whl</a><br />

如果有多个aerich版本的库文件,会在index.html文件中显示。

5 nginx安装配置

如果只是临时使用,也可以直接使用Python内置模块http.server来创建一个简单的web服务,在包文件目录(/home/pythonlibs)执行如下命令即可:

python3 -m http.server 8086

Nginx是一个高性能的HTTP和反向代理web服务器,有很好的并发性能,下面介绍使用Nginx来发布镜像源。

5.1 nginx安装

到官网 https://nginx.org/en/download.html 下载nginx安装包nginx-1.24.0.tar.gz,安装步骤如下:

# 1. 解压
$ tar -xvzf nginx-1.24.0.tar.gz -C /home# 2. 安装
$ cd /home/nginx-1.24.0/
$ ./configure --with-stream
$ make & make install

查看nginx安装路径:

$ whereis nginx
nginx: /usr/local/nginx

5.2 nginx配置

修改配置文件,其中我的Linux服务器IP地址为192.168.20.9:

$ vim /usr/local/nginx/nginx.conf1、设置
user root;2、配置pip源端口号以及路径server {listen      8086;server_name  192.168.20.9:8086;location / {root /home/pythonlibs;autoindex on;charset utf-8;}}

启动:

$ /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
$ /usr/local/nginx/sbin/nginx -s reload

注意:需要关闭服务器的防火墙,或者开放指定端口号,我这里是80876端口号。

启动成功后可在浏览器访问地址:http://192.168.20.9:8086/simple/

在这里插入图片描述

页面列出了所有索引成功的python库,说明pypi本地源已经搭建成功。

6 使用本地镜像源

本地源部署完成后,可以使用pip命令从搭建的本地源下载安装python库:

$ pip3 install xlwt -i http://192.168.20.9:8086/simple --trusted-host 192.168.20.9
--THE END--

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python求子数组和的所有元素(附Demo)

目录 前言1. 暴力求解2. 前缀和哈希表3. 滑动窗口 前言 工作需要&#xff0c;对应需要优化查找子数组和等于特定值的算法 对应的算法推荐&#xff1a;子数组相关题目 以下算法主要针对Python 1. 暴力求解 双重循环时间复杂度为 O(n2) def subarrays_with_sum_equal_k(num…

PostgreSQL如何使修改的参数生效

PostgreSQL如何使修改的参数生效 在 PostgreSQL 中&#xff0c;配置参数的更改往往需要不同的方式来使其生效。根据参数的不同&#xff0c;它们的生效方式可能有所区别&#xff0c;例如&#xff1a; 立即生效&#xff1a;某些参数可以通过会话级别的设置即时生效&#xff0c;…

HTML的常用标签

HTML&#xff08;补&#xff09; CSS选择器 元素选择器&#xff1a;指定一个标签给这个标签设置一个默认的样式。设置的样式对所有相同的标签都有用。 id选择器&#xff1a;我们可以给标签指定一个唯一的id&#xff0c;然后根据id可以在style标签中设置对应标签的样式元素。设…

【仿真建模-anylogic】FlowchartBlock原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-17 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数 函数功能FlowchartBlock(Engine engine ,Agent owner, AgentList population )构造函数&#xff…

springboot-自定义properties文件

在springboot中&#xff0c;如果我们想加载外部的配置文件&#xff0c;但是又不想与其他的配置文件产生明显的耦合&#xff0c;那么我们可以把这些配置文件&#xff0c;单独弄成一个独立的配置文件&#xff0c;比如下面的配置文件&#xff0c;我们想把这些配置移动到user.prope…

CountDownLatch案例

CountDownLatch&#xff08;倒计时门闩&#xff09;是Java并发编程中的一个同步工具&#xff0c;其作用是允许一个或多个线程等待其他线程完成操作后再继续执行。具体来说&#xff0c;它通常用于以下场景&#xff1a; 等待其他线程完成某项操作&#xff1a; 一个或多个线程需要…

element-vue3-admin用router.push跳转新页面并刷新新页面

element-vue3-admin用router.push跳转新页面并刷新新页面 方法一&#xff1a;使用key属性强制刷新1.首先在invex.vue页面加上router-view标签对2.然后在add.vue页面加入如下代码 方法二&#xff1a;使用location.reload()在add.vue页面加入location.reload()强制浏览器刷新整个…

Day 24:100301. 构成整天的下标对数目II

Leetcode 100301. 构成整天的下标对数目II 给你一个整数数组 hours&#xff0c;表示以 **小时 **为单位的时间&#xff0c;返回一个整数&#xff0c;表示满足 i < j 且 hours[i] hours[j] 构成 **整天 **的下标对 i, j 的数目。 **整天 **定义为时间持续时间是 24 小时的 *…

在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析

在Spring Cloud项目中集成Springdoc OpenAPI生成OpenAPI 3文档的详细解析 在Spring Cloud项目中生成OpenAPI 3文档&#xff0c;可以使用Springdoc OpenAPI。Springdoc OpenAPI提供了一种简单的方法来生成符合OpenAPI 3规范的API文档。以下是详细的步骤和解析&#xff0c;展示如…

助力樱桃智能自动化采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建果园种植采摘场景下樱桃成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…

虾皮平台API:获取商品买家评论数据

一、接口核心功能 在电商领域&#xff0c;买家评论对于商品的销售和商家的口碑至关重要。虾皮作为东南亚地区知名的电商平台&#xff0c;为商家提供了丰富的商品买家评论数据。为了方便商家获取这些数据&#xff0c;我们的API接口服务其核心功能就是获取商品买家评论数据信息。…

2024年6月17日--6月23日(渲染+ue独立游戏,)

工作要继续做渲染了&#xff0c;所以还是要把渲染搞一搞。 试过重点放在独立游戏上&#xff0c;有个indienova独立游戏团队是全职的&#xff0c;由于他们干了几个月&#xff0c;节奏暂时跟不上&#xff0c;紧张焦虑了。五一时也有点自暴自弃了&#xff0c;实在没必要&#xff…

docker和docker compose 部署

一. 将微服务运行在docker上&#xff1a; 1.新建一个空文件夹docker-demo&#xff0c;在里面再新建文件夹app&#xff0c;在app目录下新建一个名为Dockerfile的文件。 2.编写Dockerfile文件 3.构建镜像 4.启动镜像 5.可以访问了。 二使用Dockerfile构建微服务镜像 1.将j…

微信小程序录音和头像上传

录音&#xff1a; WXML <view class"box4">{{time}}</view> <button bind:tap"recorderBtn">开始录音</button> <button bind:tap"removeBtn">结束录音</button> <button bind:tap"playBtn"…

Spring (60)Spring WebFlux

Spring WebFlux 是 Spring 5.0 引入的新的响应式框架&#xff0c;用于构建异步的、非阻塞的和事件驱动的服务。WebFlux 使用了 Reactor 作为其响应式库&#xff0c;该库基于 Reactive Streams 规范。 核心概念 在深入了解之前&#xff0c;我们需要明确几个关键概念&#xff1…

Python | Leetcode Python题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution:def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> ListNode:A, B headA, headBwhile A ! B:A A.next if A else headBB B.next if B else headAreturn A

golang学习笔记——结构体嵌套接口

文章目录 结构体嵌套接口结构体嵌套结构体结构体实现接口接口嵌套接口结构体嵌套接口例子1例子2 总结参考资料 结构体嵌套接口 今天看k8s client-go源码时发现&#xff0c;结构体嵌套接口的现象。 // deployments implements DeploymentInterface type deployments struct {c…

gt9x双击唤醒屏幕

里面可以看到irq 和 rst的gpio引脚从设备树获取失败&#xff0c;排查设备树发现是属性名写错了&#xff1a; c &i2c1 {status "okay";goodix_ts5d {compatible "goodix,gt9xx";reg <0x5d>;// tp-size <89>;touchscreen-size-x <12…

Go Goroutine 究竟可以开多少?(详细介绍)

Go Goroutine 究竟可以开多少&#xff1f; Go语言因其高效的并发处理能力而备受欢迎&#xff0c;而Goroutine则是Go语言实现并发编程的核心。Goroutine比传统的线程更加轻量&#xff0c;允许开发者轻松地处理大量并发任务。那么&#xff0c;Go语言中的Goroutine究竟可以开多少…

6.1触发器的创建、删除和使用

6.1.1 触发器概述 触发器是一个被指定关联到表的数据库对象&#xff0c;与表的关系密切&#xff0c;不需要用户调用&#xff0c;在一个表的特定事件出现时将会被激活&#xff0c;此时某些MySql语句会自动执行。 触发器用于实现数据库的完整性&#xff0c;具有以下特点&#xff…