搭建PyPi仓库

安装依赖包

pypiserver

要搭建PyPi仓库,我们需要使用 pypiserver 库,这是一个最基本的 PyPI 服务器实现库,可以启动一个用来上传和维护Python包的服务器。

通过 pip install pypiserver 命令安装 pypiserver 库,该库在 Python 2x 或者 Python 3x 下均运行。

passlib

默认情况下,Python包的上传操作是无权限管理的,当我们希望使用密码来控制,只有指定用户才可以进行Python包的上传操作的时候,就需要使用 Apache htpasswd 文件,所以,我们需要 passlib 包来读取 Apache htpasswd 文件

通过 pip install passlib 命令安装 passlib 库,该库在 Python 2x 或者 Python 3x 下均运行。

那么 Apache htpasswd 文件是怎么生成的呢?我们需要安装 apache2-utils 工具包,以 Ubuntu 系统为例,使用下面命令安装:

$ sudo apt-get install -y apache2-utils

接下来,我们先使用 htpasswd 命令来生成一个 Apache htpasswd 文件:

$ pwd
/home/hekaiyou
$ ls -a
.
$ htpasswd -c /home/hekaiyou/.pypipasswd sam
New password: [输入密码]
Re-type new password: [再次输入密码]
Adding password for user sam

这样一个名为 sam 的用户就创建成功了,接下来我们在已有的 Apache htpasswd 文件中添加新的用户名及密码:

$ htpasswd /home/hekaiyou/.pypipasswd newuser
New password: [输入密码]
Re-type new password: [输入密码]
Adding password for user newuser

这样一个名为 newuser 的新用户也创建好了。

启动PyPI服务器

无认证方式启动

启动PyPI服务器之前需要在启动目录创建一个 packages 目录 (mkdir packages),这个目录是用来Python包的,然后就可以启动PyPI服务器:

$ pypi-server -P . -a .

因为默认情况下,上传Python是需要密码的,不管我们可以通过上面的方式关闭密码保护, -P 参数指定密码,-a 参数指定需要密码保护的操作,我们把它们同时指定为 .,表示所有的操作都不需要认证。

启动PyPI服务器,可以通过浏览器访问 http://localhost:8080/ 以打开PyPI服务器的默认欢迎页。

在没有显式指定启动参数的时候,pypiserver 库会使用 ~/packages 来保存Python包,同时监听 8080 端口来启动PyPI服务器。

认证方式启动

如果要控制用户上传Python包的操作,我们需要密码验证,在启动PyPI服务器时,通过 -P 参数来指定前面创建的 Apache htpasswd 文件。这样,用户上传Python库到私有仓库时,就会要求用户提供账户与密码。

接下来我们就可以用认证方式启动PyPI服务器了:

$ pypi-server -P /home/hekaiyou/.pypipasswd

监听端口与请求转发

通过 -p 参数可以指定PyPI服务器的端口,例如:

$ pypi-server -p 8090

私有PyPI服务器不可能包含社区所有的Python库,因此,当请求的Python包在本地上没有找到时,我们可以将请求转发到 外部PyPI源,以 阿里PyPI源 为例:

$ pypi-server --fallback-url https://mirrors.aliyun.com/pypi/simple/

这样就可以降低我们的维护成本,着重维护我们的私有内容,而不用作成一个镜像站点。

使用PyPi仓库

通过上一步,我们启动了私有PyPI服务器以后,我们可以将制作好的Python包上传到此目录下。

制作Python包

比如,我们有一个Python项目叫 hello_pypi,项目根目录下有一个 setup.py 文件,内容如下:

import setuptools
import os# 读取根目录下的 README.md 文件内容,作为项目包的详细介绍
CUR_DIR = os.path.abspath(os.path.dirname(__file__))
README = os.path.join(CUR_DIR, 'README.md')
with open('README.md', "r") as fd:long_description = fd.read()# 包含 "Required" 标识的参数为必填参数,缺少将无法上传到PyPI
# 包含 "Optional" 标识的参数为可选参数,可以被注释掉setuptools.setup(# 这是当前项目的名称,首次发布此包时,这个名称将作为注册名称# 用户将通过这个名称来安装此项目包,例如:## $ pip install sampleproject## 项目名称的命名规范请查阅:# https://packaging.python.org/specifications/core-metadata/#name# Requiredname='hello_pypi',# 项目版本格式应符合 PEP 440 规范:# https://www.python.org/dev/peps/pep-0440/# Requiredversion='1.2a1',# 用一行文本介绍当前项目包的主要功能或作用# Optionaldescription='A simple hello pypi code',# 当前项目包的具体描述,这是用户在访问PyPI时将看到的详细介绍# Optionallong_description=long_description,# 与上述的具体描述对应的内容格式,有效值包含:# text/plain, text/x-rst, and text/markdown# Optionallong_description_content_type='text/markdown',# 指向当前项目的代码仓库或主页的有效链接# Optionalurl="https://github.com/hexiaoyou/hello_pypi",# 当前项目包的作者或组织的名称# Optionalauthor="Kaiyou He",# 与上述作者或组织对应的邮件地址# Optionalauthor_email="hky0313@outlook.com",# 如果项目包比较简单,那么可以在此处手动指定软件包目录# 或者直接使用默认的 find_packages(),它会递归查找包的文件## 另外,如果项目包中只有一个Python文件,请按下面的方式使用 `py_modules` 参数# 这样会存在一个名为 `my_module` 的文件:##   py_modules=["my_module"],## Requiredpackages=setuptools.find_packages(),# 这里列出了当前项目包运行时依赖的其他项目包/库# 安装项目包时,放置在此处的所有软件包/库都将通过 pip 同时安装# 因此,它们必须是有效的库,否则将导致 pip 命令失败# Optionalinstall_requires=['colorama>=0.4.1','PrettyTable'],# 当前的项目包的关键字,这些关键字将显示在项目页面上,告知用户,这个项目与什么有关?# 请注意,这是一串用空格隔开的单词,而不是列表 keywords='demo pypi hello',
)

对应的根目录下还需要创建一个 README.md 文件,内容可以随便写。在打包之前我们可以验证 setup.py 文件的正确性:

$ python setup.py check

接下来我们需要进行打包操作,在项目根目录下执行:

$ python setup.py sdist

就这样,我们打好了一个空项目包。

上传Python包

无认证方式上传

上传命令与打包指令很像,就是后面加上 upload 参数,并用 -r 参数设置PyPI服务器地址:

$ python setup.py sdist upload -r http://localhost:8080

这样我们就可以通过 http://localhost:8080/simple/ 查看到我们刚才上传到项目包/库。

认证方式上传

认证方式上传的话,我们需要用到 twine 库,通过 pip install twine 命令安装 twine 库。

然后,在再次上传之前,我们需要改一下版本号,否则会报以下异常,即版本冲突的意思:

HTTPError: 409 Conflict from http://localhost:8080/
Conflict

我们可以在目录下添加一个 hello_pypi.py 文件,在里面设备写一个输出方法。

def demo():print('Hello PyPI')

然后在 setup.py 文件中修改版本为 version='1.2a2'。然后再通过以下命令进行验证打包:

$ python setup.py check  # 先验证
$ python setup.py sdist  # 再打包

这时,你会发现 dist 目录下出现了两个版本,这里存放的就是我们打出来的Python项目包/库。

因为有多个Python项目包/库,因此我们在上传时,要选择具体的 dist/hello_pypi-1.2a2.tar.gz 打包文件。

$ twine upload dist/hello_pypi-1.2a2.tar.gz --repository-url http://localhost:8080

下载使用Python包

就像从其他源下载第三方库一样,我们只要通过 -i 参数,就可以指定到我们自己的PyPI服务器。下载命令如下:

pip install hello_pypi -i http://localhost:8080

接下来就可以调用我们自己的Python包/库了:

>>> import hello_pypi
>>> hello_pypi.demo()
Hello PyPI
>>>

搭建、使用与维护私有PyPi仓库相关推荐

  1. 搭建Docker本地私有镜像仓库

    在使用Docker service create创建容器时,Docker首先默认从Docker Hub官方去下载镜像,这很不方便,很多时候我们的镜像都是使用Dockerfile自定义私有镜像,不对外公 ...

  2. Python 进阶 — 创建本地 PyPI 仓库与 Python 程序的离线部署

    目录 文章目录 目录 创建本地 PyPI 仓库 安装 pypiserver 上传 Python 安装包 使用私有 PyPI 仓库 Python 程序的离线部署 pip download 获取必须的 P ...

  3. 【Docker】registry部署docker私有镜像仓库

    Docker Hub作为Docker默认官方公共镜像仓库,但是如果我们不想使用怎么办,第一我们可以替换默认镜像仓库为我们国内的一些镜像仓库,第二就是如我们自己搭建一个自己的私有镜像仓库,官方也提供do ...

  4. python 内网镜像站_搭建私有YUM仓库与内网镜像站

    原标题:搭建私有YUM仓库与内网镜像站 搭建私有YUM仓库 私有yum仓库环境 系统版本:centos7.4 IP:192.168.1.47 #最好能上公网 私有yum仓库服务端配置 第一:创建使用y ...

  5. 搭建私有helm仓库及图形界面

    搭建私有helm仓库及图形界面 本篇主要介绍私有 helm 仓库 Chartmuseum 及图形界面 Monocular UI /kubeapps 的搭建 helm chart 能够很好的封装和管理我 ...

  6. Docker上部署GitLab , 搭建私有Git仓库 (基于Docker镜像sameersbn/docker-gitlab)

    # 使用docker-compose.yml 安装gitlab服务器 $ wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/ ...

  7. android 加载系统私有库,Android 搭建私有maven仓库及上传项目

    前言 在日常工作及项目迭代过程中,一定有不少同学自己写了一些框架性的东西,或者一些好用的工具,总之就是能复用的代码.然而也有不少同学为了复用这些代码不得不复制粘贴到不同项目中,这样相同的功能出现了多份 ...

  8. 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-29上传组件

    亲历的企业级微服务的完整构建过程-系列文章目录 本人参与了这次的企业级微服务的完整构建,想要记录下来以便以后复习,同时也想分享给小伙伴们,抛砖引玉,欢迎大家提出自己的意见和建议,大家一起探讨一起成长. ...

  9. Python搭建私有pypi源发包——pypi-server

    文章目录 简介 1. 搭建私有 pypi 源 2. 开发要上传的包 3. 生成 dist 目录用于上传 4. 上传包到私有 pypi 源 5. 安装 Linux 安装 参考文献 简介 本地搭建 pyp ...

最新文章

  1. cap mysql_.NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
  2. python连接服务器怎么用_使用Python连接到远程服务器
  3. 2020-2-15技术积累-时间插件-前端获取后端数据生成表格
  4. MySQL学习【第五篇SQL语句上】
  5. Python“三大器”之装饰器1
  6. Torchtext 教程
  7. eclipse导入jar包的三种方法
  8. Mysql之运算的使用
  9. c语言 队列长度,c语言 队列
  10. 东进的语音卡编程:最简单的电话外呼程序
  11. ps切图教程 android,PS前端切图完整教程
  12. 阿里-蚂蚁金服-一面电面-上海-java研发实习生
  13. 短视频不为人知的素材来源 以及平台推荐的黑盒机制
  14. 我的世界Linux服务端op,服务器,后台,单机,op必备指令大全
  15. [HDU](6333)Problem B. Harvest of Apples ---- 数论+莫队算法
  16. mysql主备同步错误:Last_Error: Could not execute Update_rows event; Error_code: 1032;
  17. 您的企业适合导入APS系统吗?跟着小编来了解一下吧(上)
  18. Jetson Xaiver NX相关教程(详细版)
  19. mysql的学生选课表_50个常用sql语句 网上流行的学生选课表的例子
  20. 《机器学习实战》第3章—隐形眼镜类型(Jupyter版决策树)

热门文章

  1. html email输入框,html5给文本框实现email域名自动完成效果
  2. 夏侯南溪搭建目标检测模型——数据读取篇
  3. Java构造函数执行顺序
  4. keras embeding设置初始值的两种方式
  5. Python面向对象几个知识点
  6. c/c++教程 - 1.7 数组 一维数组 二维数组
  7. 树莓派入门教程 - 0 - 准备篇 - 0.4 树莓派安装FTP服务器
  8. 机器学习之支持向量机(SVM)小结
  9. 【Java】位运算符:左移右移
  10. 【书摘】三毛最深情的二十句话