关于我

一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android、Python、Java和Go,这个也是我们团队的主要技术栈。

Github:https://github.com/hylinux1024

微信公众号:终身开发者(angrycode)

当我们开发了一个开源项目时,就希望把这个项目打包然后发布到pypi.org上,别人就可以通过pip install的命令进行安装。本文的教程来自于Python官方文档如有不正确的地方欢迎评论拍砖。

0x00 创建项目

本文使用到的项目目录为

  1. packaging-tutorial
  2. .
  3. └── bestpkg
  4. └── __init__.py

接下来的所有操作都是在packing_tutorial这个目录下进行的。首先把bestpkg这个目录下的__init__.py添加以下内容

  1. info='packaging demo'

这个信息主要用于打包成功后安装测试用的。

0x01 项目结构

一个待发布的项目还需要有以下这些文件:setup.pyLICENSEREADME.md

  1. packaging-tutorial
  2. .
  3. ├── LICENSE
  4. ├── README.md
  5. ├── bestpkg
  6. └── __init__.py
  7. └── setup.py

0x02 setup.py

setup.py文件是给setuptools工具的使用脚本,告诉setuptools如何构建我们的项目。打开编辑器,编辑setup.py文件,输入以下内容

  1. import setuptools
  2. # 读取项目的readme介绍
  3. with open("README.md", "r") as fh:
  4. long_description = fh.read()
  5. setuptools.setup(
  6. name="bestpkg",# 项目名称,保证它的唯一性,不要跟已存在的包名冲突即可
  7. version="0.0.1",
  8. author="hylinux1024", # 项目作者
  9. author_email="hylinux1024@gmail.com",
  10. description="一个牛逼的程序", # 项目的一句话描述
  11. long_description=long_description,
  12. long_description_content_type="text/markdown",
  13. url="https://github.com/hylinux1024/niubiproject",# 项目地址
  14. packages=setuptools.find_packages(),
  15. classifiers=[
  16. "Programming Language :: Python :: 3",
  17. "License :: OSI Approved :: MIT License",
  18. "Operating System :: OS Independent",
  19. ],
  20. )
  • name

    项目名称,保证它的唯一性,不要跟已存在的包名冲突即可,否则会发布失败
  • version

    版本号
  • author

    作者
  • author_email

    作者邮箱
  • description

    一句话描述项目
  • long_description

    项目详细说明,一般直接读取README.md的内容
  • url

    项目的链接地址
  • packages

    列出当前项目的包,一般直接使用find_packages()即可
  • classifiers

    这里指定Python的兼容版本是Python3,也指定了项目使用的开源协议。

0x03 README.md

给项目添加详细的README

  1. # Example Package
  2. This is a simple example package. You can use
  3. [Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
  4. to write your content.

0x04 LICENSE

要发布包到pypi上,选择一个合适的开源协议是非常重要的。如果不知道怎么选可以到https://choosealicense.com/这里看看。

0x05 项目打包

项目需要打包后才能发布,要打包项目需先安装最新版本的setuptoolswheel

  1. python3 -m pip install --user --upgrade setuptools wheel

然后使用以下命令进行打包

  1. python3 setup.py sdist bdist_wheel

当看到以下信息,说明已经打包成功

  1. ...
  2. ...
  3. ...
  4. adding license file "LICENSE" (matched pattern "LICEN[CS]E*")
  5. creating build/bdist.macosx-10.14-x86_64/wheel/bestpkg-0.0.1.dist-info/WHEEL
  6. creating 'dist/bestpkg-0.0.1-py3-none-any.whl' and adding 'build/bdist.macosx-10.14-x86_64/wheel' to it
  7. adding 'bestpkg/__init__.py'
  8. adding 'bestpkg-0.0.1.dist-info/LICENSE'
  9. adding 'bestpkg-0.0.1.dist-info/METADATA'
  10. adding 'bestpkg-0.0.1.dist-info/WHEEL'
  11. adding 'bestpkg-0.0.1.dist-info/top_level.txt'
  12. adding 'bestpkg-0.0.1.dist-info/RECORD'
  13. removing build/bdist.macosx-10.14-x86_64/wheel

在项目目录下会生成一个distbuild文件夹

  1. packaging-tutorial tree
  2. .
  3. ├── LICENSE
  4. ├── README.md
  5. ├── bestpkg
  6. └── __init__.py
  7. ├── bestpkg.egg-info
  8. ├── PKG-INFO
  9. ├── SOURCES.txt
  10. ├── dependency_links.txt
  11. └── top_level.txt
  12. ├── build
  13. ├── bdist.macosx-10.14-x86_64
  14. ├── bdist.macosx-10.9-x86_64
  15. └── lib
  16. └── bestpkg
  17. └── __init__.py
  18. ├── dist
  19. ├── bestpkg-0.0.1-py3-none-any.whl
  20. └── bestpkg-0.0.1.tar.gz
  21. └── setup.py
  22. 8 directories, 11 files

dist文件中有两个文件

  1. dist
  2. ├── bestpkg-0.0.1-py3-none-any.whl
  3. └── 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工具来上传我们的包。使用以下命令进行安装:

  1. python3 -m pip install --user --upgrade twine

使用以下命令上传dist目录下的文件

  1. python3 -m twine upload --repository-url https://test.pypi.org/legacy/ dist/*

这个命令会提示输入刚在test.pypi.org上注册账号密码,并出现类似以下信息后说明已经上传成功。

  1. Enter your username: hylinux1024
  2. Enter your password:
  3. Uploading distributions to https://test.pypi.org/legacy/
  4. Uploading bestpkg-0.0.1-py3-none-any.whl
  5. 100%|██████████████████████████████████████| 4.57k/4.57k [00:00<00:00, 8.01kB/s]
  6. Uploading bestpkg-0.0.1.tar.gz
  7. 100%|██████████████████████████████████████| 4.18k/4.18k [00:01<00:00, 3.23kB/s]

然后打开https://test.pypi.org/project/bestpkg/这个地址就可以看到我们发布的包。

0x07 安装

发布成功之后就可以使用pip来安装来。我们在虚拟环境中安装,关于虚拟环境可以看我前一篇文章

这里就使用pipenv,这里我直接进入到我昨天创建的那个项目中,也为了更好演示安装结果。

  1. pip install --index-url https://test.pypi.org/simple/ --no-deps bestpkg

在这里我使用--index-url参数是为了指定从test.pypi.org中安装,而不是正式包索引库中查找要安装的包。还有使用了--no-deps参数是因为本例中没有使用到其它的依赖库。

在终端会看到以下类似信息,说明安装成功

  1. Looking in indexes: https://test.pypi.org/simple/
  2. Collecting bestpkg
  3. Downloading https://test-files.pythonhosted.org/packages/5a/fc/c109b3872b6c06e7368c30b6e52501113846f90ca716a434766151093173/bestpkg-0.0.1-py3-none-any.whl
  4. Installing collected packages: bestpkg
  5. Successfully installed bestpkg-0.0.1

进入交互界面

  1. (pipenvdemo) pipenvdemo python
  2. >>> import bestpkg
  3. >>> bestpkg.info
  4. 'packaging demo'

info变量就是在__init__.py文件中定义的变量。自此我们的包发布、安装使用流程就走完了。

要在正式的Python索引库中发布,只需要到https://pypi.org/注册账号,并上传就可以了。

0x08 总结一下

通过一个简单的例子展示Python通过setuptools工具进行打包,然后上传到test.pypi.org的流程。如果要上传到正式的pypi.org上,只需要注册一个正式的账号。一旦发布成功就可以使用pip install [your-package]的命令进行安装。

0x09 引用

Python程序包的构建和发布过程的更多相关文章

  1. 想拥有自己的Python程序包,你只需15步

    来源商业新知网,原标题:15步,你就能拥有自己的Python程序包 全文共 3192 字,预计学习时长 6 分钟 每个软件开发员和数据科学家都难免要做程序包.本文推荐一篇 Python开源程序包的制作 ...

  2. 利用 pip 安装 Python 程序包到个人用户文件夹下

    利用 --user 参数,即 pip install --user package_name 这样会将Python 程序包安装到 $HOME/.local 路径下,其中包含三个字文件夹:bin,lib ...

  3. pip升级Python程序包

    列出当前安装的包: pip list 列出可升级的包: pip list --outdate 升级一个包: pip install --upgrade requests // mac,linux,un ...

  4. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  5. Linux 程序包管理-YUM

    前端工具YUM管理程序包:  rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系:很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂:使用yum可以解决这个问题 ...

  6. Oracle存储过程和程序包

    一.为什么要用存储过程? 如果在应用程序中经常需要执行特定的操作,可以基于这些操作简历一个特定的过程.通过使用过程可以简化客户端程序的开发和维护,而且还能提高客户端程序的运行性能. 二.过程的优点? ...

  7. 【Azure DevOps系列】Azure DevOps构建并发布Nuget程序包

    在Azure DevOps中,管道可以用来构建解决方案,O(∩_∩)O哈哈~快万能了,本章主要介绍如何创建Nuget包并且将其发布到Nuget服务器的过程. 前面我创建了一个非常简单的类库,这边我不做 ...

  8. 全面学习 Python 包:包的构建与分发

    首发于公众号:Python编程时光 1. 为什么需要对项目分发打包? 平常我们习惯了使用 pip 来安装一些第三方模块,这个安装过程之所以简单,是因为模块开发者为我们默默地为我们做了所有繁杂的工作,而 ...

  9. NuGet -- 如何创建及发布自己的程序包

    STEP 1:在NuGet上注册并获取API Key    首先,你需要在NuGet(https://www.nuget.org/)上注册一个新的账号,然后在My Account页面,获取一个API ...

随机推荐

  1. 【HDU - 1560】DNA sequence (dfs+回溯)

    DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...

  2. Unity游戏神经网络版坦克大战

    基于遗传算法优化的神经网络来训练坦克AI是什么体验呢?下面有bulid好的demo. 包括window和安卓两个版本. 这是一个Unity项目. 下载链接:https://pan.baidu.com/ ...

  3. 个人永久性免费-Excel催化剂功能第93波-地图数据挖宝之两点距离的路径规划

    在日常手机端,网页端的向地图发出两点距离的行程规划,相信绝大多数人都有用到过,但毕竟是个体单一行为,若某些时候需要用到批量性的操作,就显得很不现实了,同时,数据只是在应用或网页内,非结构化的数据,也是 ...

  4. TensorFlow笔记-文件读取

    小数量数据读取 这些只用于可以完全加载到内存中的小型数据集: 1,储存在常数中 2,储存在变量中,初始化后,永远不改变它的值 使用常量 training_data = ... training_lab ...

  5. 解决Windows10下安装Ubuntu16.04双系统后开机没有Ubuntu引导

    转载 https://blog.csdn.net/qq_27838307/article/details/79149791 1.按照网上教程在磁盘中压缩硬盘并且不需要给他新建卷标,就让他显示空闲就好了 ...

  6. 解决 document.getElementsByClassName 在 IE8 下的兼容下的问题

    H5中新增了一个令人期待已久的方法:getElementsByClassName,这个方法让我们可以通过 class 属性中的类名来访问元素,这是极好的. but! 这个方法在IE9以下的浏览器是不支 ...

  7. UPC Contest RankList – 2019年第二阶段我要变强个人训练赛第十六场

    E: 飞碟解除器 •题目描述 wjyyy在玩跑跑卡丁车的时候,获得了一个飞碟解除器,这样他就可以免受飞碟的减速干扰了.飞碟解除器每秒末都会攻击一次飞碟,但每次只有p/q的概率成功攻击飞碟.当飞碟被成功 ...

  8. jsp数据交互(二).1

    对象的作用域:   JSP中提供了四种作用域,分别是page作用域,request作用域,session作用域和application作用域. page作用域: page作用域指单一JSP页面的范围, ...

  9. 2019全国大学生信息安全与对抗技术竞赛全国线下总决赛 Writeup

    0x00 Begin 关于 ISCC 2019 北理工总决赛,这一次比赛体验感总体差不多,最后我们战队荣获全国一等奖第一名,在这里非常感谢我的团队以及我的队友. 0x01 Reverse 下载题目:e ...

  10. 【Spring源码解析】—— 委派模式的理解和使用

    一.什么是委派模式 委派模式,是指什么呢?从字面含义理解,委派就是委托安排的意思,委派模式就是在做具体某件事情的过程中,交给其他人来做,这个事件就是在我的完整链路上的一部分,但是复杂度较高的情况下或者 ...