Python程序包的构建和发布过程
关于我
一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。
Github:https://github.com/hylinux1024
微信公众号:终身开发者(angrycode)
当我们开发了一个开源项目时,就希望把这个项目打包然后发布到pypi.org
上,别人就可以通过pip install
的命令进行安装。本文的教程来自于Python
官方文档,如有不正确的地方欢迎评论拍砖。
0x00 创建项目
本文使用到的项目目录为
➜ packaging-tutorial
.
└── bestpkg
└── __init__.py
接下来的所有操作都是在packing_tutorial
这个目录下进行的。首先把bestpkg
这个目录下的__init__.py
添加以下内容
info='packaging demo'
这个信息主要用于打包成功后安装测试用的。
0x01 项目结构
一个待发布的项目还需要有以下这些文件:setup.py
、LICENSE
和README.md
➜ packaging-tutorial
.
├── LICENSE
├── README.md
├── bestpkg
│ └── __init__.py
└── setup.py
0x02 setup.py
setup.py
文件是给setuptools
工具的使用脚本,告诉setuptools
如何构建我们的项目。打开编辑器,编辑setup.py
文件,输入以下内容
import setuptools
# 读取项目的readme介绍
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="bestpkg",# 项目名称,保证它的唯一性,不要跟已存在的包名冲突即可
version="0.0.1",
author="hylinux1024", # 项目作者
author_email="hylinux1024@gmail.com",
description="一个牛逼的程序", # 项目的一句话描述
long_description=long_description,
long_description_content_type="text/markdown",
url="https://github.com/hylinux1024/niubiproject",# 项目地址
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
- name
项目名称,保证它的唯一性,不要跟已存在的包名冲突即可,否则会发布失败 - version
版本号 - author
作者 - author_email
作者邮箱 - description
一句话描述项目 - long_description
项目详细说明,一般直接读取README.md的内容 - url
项目的链接地址 - packages
列出当前项目的包,一般直接使用find_packages()
即可 - classifiers
这里指定Python
的兼容版本是Python3
,也指定了项目使用的开源协议。
0x03 README.md
给项目添加详细的README
# Example Package
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
0x04 LICENSE
要发布包到pypi
上,选择一个合适的开源协议是非常重要的。如果不知道怎么选可以到https://choosealicense.com/这里看看。
0x05 项目打包
项目需要打包后才能发布,要打包项目需先安装最新版本的setuptools
和wheel
➜ python3 -m pip install --user --upgrade setuptools wheel
然后使用以下命令进行打包
➜ python3 setup.py sdist bdist_wheel
当看到以下信息,说明已经打包成功
...
...
...
adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL
creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it
adding 'bestpkg/__init__.py'
adding 'bestpkg-0.0.1.dist-info/LICENSE'
adding 'bestpkg-0.0.1.dist-info/METADATA'
adding 'bestpkg-0.0.1.dist-info/WHEEL'
adding 'bestpkg-0.0.1.dist-info/top_level.txt'
adding 'bestpkg-0.0.1.dist-info/RECORD'
removing build/bdist.macosx-10.14-x86_64/wheel
在项目目录下会生成一个dist
和build
文件夹
➜ packaging-tutorial tree
.
├── LICENSE
├── README.md
├── bestpkg
│ └── __init__.py
├── bestpkg.egg-info
│ ├── PKG-INFO
│ ├── SOURCES.txt
│ ├── dependency_links.txt
│ └── top_level.txt
├── build
│ ├── bdist.macosx-10.14-x86_64
│ ├── bdist.macosx-10.9-x86_64
│ └── lib
│ └── bestpkg
│ └── __init__.py
├── dist
│ ├── bestpkg-0.0.1-py3-none-any.whl
│ └── bestpkg-0.0.1.tar.gz
└── setup.py
8 directories, 11 files
在dist
文件中有两个文件
dist
├── bestpkg-0.0.1-py3-none-any.whl
└── bestpkg-0.0.1.tar.gz
tar.gz
文件是源码文件压缩包,而.whl
就是打包后的文件。最新的pip
命令会安装这个.whl
文件。
0x06 上传
现在就可以上传到Python
索引库了。我们使用Test PyPI
,这个是测试用的Pypi
,本例子也是使用Test Pypi
。
首先要到https://test.pypi.org/account/register/注册账号。本例中我注册的账号为:hylinux1024。
然后使用twine
工具来上传我们的包。使用以下命令进行安装:
➜ python3 -m pip install --user --upgrade twine
使用以下命令上传dist
目录下的文件
➜ python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*
这个命令会提示输入刚在test.pypi.org
上注册账号密码,并出现类似以下信息后说明已经上传成功。
Enter your username: hylinux1024
Enter your password:
Uploading distributions to https://test.pypi.org/legacy/
Uploading bestpkg-0.0.1-py3-none-any.whl
100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]
Uploading bestpkg-0.0.1.tar.gz
100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]
然后打开https://test.pypi.org/project/bestpkg/这个地址就可以看到我们发布的包。
0x07 安装
发布成功之后就可以使用pip
来安装来。我们在虚拟环境中安装,关于虚拟环境可以看我前一篇文章。
这里就使用pipenv
,这里我直接进入到我昨天创建的那个项目中,也为了更好演示安装结果。
➜ pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg
在这里我使用--index-url
参数是为了指定从test.pypi.org
中安装,而不是正式包索引库中查找要安装的包。还有使用了--no-deps
参数是因为本例中没有使用到其它的依赖库。
在终端会看到以下类似信息,说明安装成功
Looking in indexes: https://test.pypi.org/simple/
Collecting bestpkg
Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whl
Installing collected packages: bestpkg
Successfully installed bestpkg-0.0.1
进入交互界面
(pipenvdemo) ➜ pipenvdemo python
>>> import bestpkg
>>> bestpkg.info
'packaging demo'
info
变量就是在__init__.py
文件中定义的变量。自此我们的包发布、安装使用流程就走完了。
要在正式的Python
索引库中发布,只需要到https://pypi.org/注册账号,并上传就可以了。
0x08 总结一下
通过一个简单的例子展示Python
通过setuptools
工具进行打包,然后上传到test.pypi.org
的流程。如果要上传到正式的pypi.org
上,只需要注册一个正式的账号。一旦发布成功就可以使用pip install [your-package]
的命令进行安装。
0x09 引用
- https://packaging.python.org/tutorials/packaging-projects/
Packaging Python Projects
Python程序包的构建和发布过程的更多相关文章
- 想拥有自己的Python程序包,你只需15步
来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...
- 利用 pip 安装 Python 程序包到个人用户文件夹下
利用 --user 参数,即 pip install --user package_name 这样会将Python 程序包安装到 $HOME/.local 路径下,其中包含三个字文件夹:bin,lib ...
- pip升级Python程序包
列出当前安装的包: pip list 列出可升级的包: pip list --outdate 升级一个包: pip install --upgrade requests // mac,linux,un ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- Linux 程序包管理-YUM
前端工具YUM管理程序包: rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系:很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂:使用yum可以解决这个问题 ...
- Oracle存储过程和程序包
一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...
- 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包
在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...
- 全面学习 Python 包:包的构建与分发
首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...
- NuGet -- 如何创建及发布自己的程序包
STEP 1:在NuGet上注册并获取API Key 首先,你需要在NuGet(https://www.nuget.org/)上注册一个新的账号,然后在My Account页面,获取一个API ...
随机推荐
- 我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了
我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了
- 个人永久性免费-Excel催化剂功能第24波-批量发送邮件并指点不同附件不同变量
批量发送邮件功能,对高级OFFICE用户来说,第1时间会想到使用WORD的邮件合并功能.但对于需要发送附件来说,邮件合并功能就无能为力,同样还有的限制是用户电脑上没有安装OUTLOOK,同样也不能发送 ...
- python面向过程编程 - ATM
前面程序整合加自定义日志 1.文件摆放 ├── xxxx │ ├── src.py │ └── fil_mode.py │ └── data_time.py │ └── loading.py │ └─ ...
- 基于python图片识别工具(图片识别,车牌,PDF,验证码)
先上图 不多说. 对于一般的用户来说识别率还是能达到百分之90以上. 已经打包成exe文件.windows用户可以直接使用.要软件的加我QQ python代码: # -*- coding: UTF- ...
- Vue模板语法与常用指令
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.在底层的实现上,Vue 将模板编译成虚拟 DOM 渲染函数,结合相应系统,在应用状态改变时 ...
- json与js对象间的转化
- React Hooks 深入系列 —— 设计模式
本文是 React Hooks 深入系列的后续.此篇详细介绍了 Hooks 相对 class 的优势所在, 并介绍了相关 api 的设计思想, 同时对 Hooks 如何对齐 class 的生命周期钩子 ...
- 解决:Navicat连接不上MySQL 8.0
转载自 https://www.cnblogs.com/shiysin/p/shiysin.html Navicat连接不上,总是报错1251: 原因是MySQL8.0版本的加密方式和MySQL5.0 ...
- CSS等分布局方法
原文链接:http://caibaojian.com/css-equal-layout.html CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性. 一:浮动布局+百 ...
- 【科研民工笔记2】Ubuntu 16.04 安装nvidia驱动
我的主机是2060的显卡,用的是安装在U盘中的Ubuntu,开机进入后,因为没有安装驱动,所以界面看以来比较大. 通过手动方式,成功安装驱动,最终成功的方案使用的是run文件安装的方式. 1.手动下载 ...