python如何将自己的包上传到PyPi并可通过pip安装的方法步骤
作者:一秋闲谈 发布时间:2021-04-02 10:53:07
当逐渐在用python开发项目或者日常使用时,一般需要大量使用别人提供的包,这些包能高效的帮助我们快速高效的完成指定任务或者需求,不过有时也会想,自己如果能够把自己的代码打包并上传到PyPi,后续其他人也可以通过pip进行安装,在为Python做出贡献的同时,对自己也是一件很cool的事情,本文章便详细介绍如何将自己的代码打包并上传到PyPi。
在这之前,也建议大家在日常使用python时,也需要有模块的思维,将最为通用的任务模块化,然后创建包,后续便可以通过导入这个包,快速进行复用。
写该篇文章时,作者已向PyPi上传了一个名为 common-pkg-dennis 的包,大家可以通过 pip install common-pkg-dennis 下载安装并查看(该包内作者简单放置了之前封装的关于数据库操作和m3u8类视频文件下载的方法,包括加密和未加密情况,均可进行下载)
一、创建包
1.1 包概念简述
Python语言如其他编程语言,讲求代码最大化复用,函数和类是最初级的复用,模块(本质是一个py文件)是更高一级的复用,而包(本质是包含py文件且包含一个__init__.py文件的文件夹)则是最高程度的复用,一般情况下,一个包会包含一种完成的解决方案,比如scrapy,其中包含了完整的爬虫解决方案。
此处只是简单介绍以上概念,详细的可以通过学习基础Python知识获得。
1.2 创建包结构
通常意义上的包结构如下:
example_package
----example_pkg
----__init__.py
其中,example_package和example_pkg均为一个文件夹,而__init__.py则为文件夹example_pkg内的一个py文件,该文件为包的标示,是必须有的,可以为空,至于__init__.py文件的作用,此处不进行介绍
当然包可以有多层结构,比如下面的结构:
example_package
----example_pkg
----__init__.py
----sec_example_pkg
----__init__.py
1.3 本地使用
一般在日常使用python时,可将处理关联性较高的代码和模块,包含到一个包内,比如下面的包,即包含了处理媒体相关的模块
media
----__init__.py
----video
----__init__.py
----volume.py #包含处理声音相关函数等
----convert.py #包含转码相关功能
----combine.py #包含视频合成相关
----audio
----__init__.py
----convert.py #包含转码相关功能
----compile.py #包含编译相关功能
然后将以上包移动到python的根site_packages文件夹内,或者指定虚拟环境内的site_packages内,然后就可以直接使用import导入以上包或者指定模块,python会按照包和模块搜索路径完成加载
一般日常中,我们基本达到这个程度,不过,如果自己感觉自己维护的包足够优秀,或者在解决特定领域问题时,足够强大且性能优异,可上传到PyPi并与他人共享,说不定自己的包后面很有可能成为python后续版本内的buildin模块。
二、上传前准备
2.1 完善包相关信息
我们接着使用example项目举例,需要在该文件夹内创建以下文件,以为接下来创建可供分发的文件做准备
example_package
----LICENSE.txt #版权声明文件
----README.md #分发包的详细介绍文件
----example_pkg
----__init__.py
----setup.py #为打包做准备的设置文件
----tests #测试文件夹,一般用不到
2.1.2 setup.py简述
setip.py文件相对比较关键,一般在该文件内约定此次分发的包的版本号、名称、作者、联系方式、项目地址、python版本要求等信息,其文件内最基本的主信息如下:
import setuptools #导入setuptools打包工具
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
setuptools.setup(
name="example-pkg-YOUR-USERNAME", # 用自己的名替换其中的YOUR_USERNAME_
version="0.0.1", #包版本号,便于维护版本
author="Example Author", #作者,可以写自己的姓名
author_email="author@example.com", #作者联系方式,可写自己的邮箱地址
description="A small example package",#包的简述
long_description=long_description, #包的详细介绍,一般在README.md文件内
long_description_content_type="text/markdown",
url="https://github.com/pypa/sampleproject", #自己项目地址,比如github的项目地址
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires='>=3.6', #对python的最低版本要求
)
2.1.3 README.md文件简述
README.md文件主要是用来对此次发行的包的详细说明,包括用法和注意事项等
# Example Package
#在此文件内,可使用markdown撰写对包的详细介绍和说明,便于别人熟悉和使用,在此不再赘述
This is a simple example package. You can use
[Github-flavored Markdown](https://guides.github.com/features/mastering-markdown/)
to write your content.
2.1.4 LICENSE文件简述
版权声明文件,一般告诉使用者可以在什么场景下使用,如果想详细了解,可访问 https://choosealicense.com 进行了解,此处不再详细展开,一般直接将以下文案复制至文件内即可
Copyright (c) 2021 The Python Packaging Authority
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
2.2 创建可供分发的包
2.2.1 安装或更新setuptools 和wheel
一般使用setuptools和wheel工具打包生成可上传和分发,并可使用pip安装的包文件
#安装或更新setuotools和wheel
python3 -m pip install --upgrade setuptools wheel
2.2.2 打包并生成tar.gz和whl文件
然后,在终端或cmd命令窗,将当前路径cd到setup.py文件所在文件夹,并正式打包
#以mac为例
cd example_packages/example_pkg
#运行以下命令
python3 setup.py sdist bdist_wheel
运行完毕后,如果顺利,则会在与setup.py文件同一层级,产生一个dist文件夹,此时文件夹结构如下:
example_package
----LICENSE.txt #版权声明文件
----README.md #分发包的详细介绍文件
----example_pkg
----__init__.py
----setup.py #为打包做准备的设置文件
----tests #测试文件夹,一般用不到
----dist
该文件夹内会包含whl和tar.gz类型文件,此时,其实可以直接将该文件转发给朋友,朋友保存到本地,就可通过pip进行安装,不过这样还没达到我们的目的。
三、上传包至PyPi
3.1 使用PyPi测试环境先熟悉上传步骤
PyPi为了便于大家练习上传过程,所以还同步提供了功能与PyPi完全一样但相互隔离的测试环境,一般通过twine包将以上打包好的文件上传至PyPi
在这之前,大家需要首先注册一个test环境的PyPi账号,可通过链接 https://test.pypi.org/account/register/ 进行注册。
然后大家需要在我的→account setting处设置自己用API上传时使用的token信息,工作原理类似git hub,快速传送门 https://test.pypi.org/manage/account/#api-tokens。
来源:https://blog.csdn.net/yifengchaoran/article/details/113447773


猜你喜欢
- 前言Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。由于 Tki
- 一个页面执行一次Sql语句的话,不会影响到性能。如果一个页面要执行很多次Sql语句,而且使用的是同一个数据库连接,那么上面的方法可能会影响到
- asyncio介绍熟悉c#的同学可能知道,在c#中可以很方便的使用 async 和 await 来实现异步编程,那么在p
- 这篇文章主要介绍了python ftplib模块使用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 代码如下:ALTER proc [dbo].[sp_common_paypal_AddInfo] ( @paypalsql va
- python 远程统计文件#!/usr/bin/python#encoding=utf-8import timeimport osimpor
- 本文实例讲述了python实现上传样本到virustotal并查询扫描信息的方法。分享给大家供大家参考。具体方法如下:import simp
- 如下所示:df = df[df['cityname']==u'北京市']记得,如果用的python2,一定要
- 本文实例讲述了python实现美团订单推送到测试环境,提供便利操作。分享给大家供大家参考,具体如下:背景: 有时候需要在测试环境下一个美团的
- 使用正则提取数据,请求库requests,看代码,在存入数据库时,报错ERROR 1054 (42S22): Unknown column
- PHP chr() 函数实例从不同 ASCII 值返回字符:<?php echo chr(52) . "<br>
- 1. datetime模块介绍1.1 datetime模块包含的类1.2 datetime模块中包含的常量2. datetime实例的方法案
- 如何最准确地统计在线用户数?我们推荐的这个程序据说是目前最好的在线用户数量统计程序。代码如下:'首先要设置好global.asa&n
- SQL数据库连接超时时间已到问题1:System.InvalidOperationException: 超时时间已到。超时时间已到,但是尚未
- 1. 多线程的作用简而言之,多线程是并行处理相互独立的子任务,从而大幅度提高整个任务的效率。2. Python中的多线程相关模块和方法Pyt
- 注意:我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时,功能可能存
- 对于请求一些网站,我们需要加上请求头才可以完成网页的抓取,不然会得到一些错误,无法返回抓取的网页。下面,介绍两种添加请求头的方法。方法一:借
- 这篇文章主要介绍了Python实现图片批量加入水印代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 1. 模块介绍1. bisect模块为内置标准库,它实现了二分法查找算法(只要提到二分法查找,应该优先想到此模块)2. 主要包含有两个函数:
- 本文讲述了joomla组件开发知识点。分享给大家供大家参考,具体如下:在你进行编码之前,有一些文件和文件夹需要创建和一些查询语句需要运行。你