| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python 基础合集10:模块和包(下)-发布属于自己的第一个模块包 -> 正文阅读 |
|
[Python知识库]Python 基础合集10:模块和包(下)-发布属于自己的第一个模块包 |
一、前言本小节通过一个案例,梳理了模块和包的发布流程及相关细节,包括自建包的本地调用、包的配置文件、打包命令和测试安装、上传细节等。 环境说明:Python 3.6、windows11 64位 二、包的发布2.1 包的结构及功能这里我准备了一个包
其他6个
相关代码具体如下:
注:如果觉得太过于复杂,可以对代码和文件进行删减,仅保留某个功能,如每个文件仅保留一个变量和函数,把类去掉,文件也可以把 2.2 包在本地调用测试将以上文件放到Python的包路径( 2.2.1
|
参数 | 参数说明 |
---|---|
name | 包名称,在上传PyPI上列出的名字。为了避免重复,官方建议加上自己的用户名作为后缀。该名称不区分大小写,并将任意长的下划线、连字符和/或句点视为相等。如包名a-b ,使用者可以通过a-b 、a_b 、a.b 、a__-.-__b 等下载它或声明对他的依赖 |
version | 包的版本号。如:0.0.1 |
description | 简述包的功能 |
long_description | 详述包的功能,可以是readme.md 文档内容 |
long_description_content_type | 详述包功能的内容的文本类型,如:'text/markdown' |
url | 包的主页链接,可以填写发布到GitHub的链接,如Python官方的一个sampleproject 实例首页链接:‘https://github.com/pypa/sampleproject’ |
author | 作者名字 |
author_email | 作者的邮箱 |
classifiers | - Development Status:3 - Alpha(内部测试版,不对外发布,一般只有测试人员使用)、4 - Beta(公开测试版)、5 - Production/Stable(稳定版) - Intended Audience:目标受众,如Developers - Topic:领域,如Software Development :: Build Tools - License:版权声明,如OSI Approved :: MIT License - Programming Language:如Python :: 3、Python :: 3.6 - Operating System:你的操作系统,如:Microsoft、OS Independent等 |
keywords | 给包打标签,如sample, setuptools, development |
project_urls | 包项目的相关链接 - Documentation:使用文档 - Funding:资助链接 - Say Thanks!:感谢链接 - Source:包的来源,一般在GitHub上 - Bug Reports:错误报告,一般是GitHub的issue链接 |
packages | 包目录,可以传入列表,列表的元素是包的名称,如本项目可传入[xindata_package_test] ;也可以使用setuptools.find_packages() 指定,如果包的源码在根目录,则不用加参数(如本项目),如果包的源码在根目录的src 文件夹下,可传入参数where="src" 或include=['src', 'src.*'] |
package_dir | 当你的源代码在项目根目录下的子目录中,例如。’ src/ ‘时,必须指定’ package_dir '参数。如:{"": "src"} ,键为空字符串表示是根目录。 |
py_modules | 如果包的主体内容(实现某功能的代码文件)比较简单,仅在根目录下的一两个.py ,通过该参数指定模块。将模块名去掉后缀,然后以列表形式传入,如['a','b'] |
install_requires | 包的依赖项,通过pip下载包的时候会查看已有的python环境中是否有相关依赖项,如果没有,则会进行安装。相关模块和包可指定版本,以列表形式传入,如['A>=1,<2', 'B>=2', 'C'] |
python_requires | Python版本的要求,如'>=2.6, !=3.0.*, !=3.1.*, !=3.2.*' |
package_data | 包中使用到的数据,包含文本、表等。传入形式:{“数据文件所在文件夹”:“数据文件名”},如{'sample': ['package_data.dat']} 表示数据文件的路径为sample\\package_data.dat |
data_files | 当数据文件不内置,而是放在包外时,可使用该参数,示例:[("my_data", ["data/data_file"])] ,含义是在Python安装目录(假设是D:\\python3 )下生成my_data (即D:\\python\\my_data ),安装时,将源码包中的data/data_file 放到my_data 下 |
setup.py文件相对比较关键,一般在该文件内注明本次分发的包的版本号、名称、作者、联系方式、项目地址、python版本要求等信息。
文件内最基本的主信息如下:
# setup.py
import setuptools # 导入setuptools打包工具
with open("README.md", "r", encoding="utf-8") as f:
long_description = f.read()
setuptools.setup(
name="xindata_package_test" # 必要参数
,version="0.0.1" # 必要参数,包版本号,便于维护版本
,packages=setuptools.find_packages() # 必要参数,源代码所在文件夹在项目根目录下
,author="Xin_data" # 作者,可以写自己的姓名
,author_email="jaxmin.lee@outlook.com" # 作者联系方式,可写自己的邮箱地址
,description="A test package" # 包的简述
,long_description=long_description # 包的详细介绍,一般在README.md文件内
,long_description_content_type="text/markdown"
,classifiers=[
"Programming Language :: Python :: 3"
,"License :: OSI Approved :: MIT License"
]
,python_requires='>=3.6' # Python版本要求
)
接下来要使用上面生成的setup.py
文件对整个文件夹进行打包,在调用命令行或终端操作时,需要切换路径到setup.py
所在的文件夹下,常用切换路径的方法:
cd [路径]
。
除了调用命令行或终端+切换路径,还有一个更便捷的方式(上一小节:模块和包(上)也有提到过),就是打开setup.py
文件所在的文件夹,在地址栏输入%comspec%
(如下图),回车即可。
调出命令行或终端并切换到setup.py
所在文件夹之后,就可以输入以下命令进行打包。
sdist
指的是source dist
,即源码发布,将setup.py
一起打包,一般是以压缩包的形式存在,安装时解压,然后通过setup.py
安装;bdist
指的是built (binary) dist
,即编译(为二进制)后发布,不含setup.py
,一般是生成.whl
或.egg
,安装时通过pip install [模块名]
或pip install [.whl或.egg文件]
。
Wheel 的出现是为了替代 Egg,它的本质是一个zip包,现在被认为是 Python 的二进制包的标准格式,即wheel 是新的 Python 的 disribution,用于替代 Python 传统的 egg 文件。本次采用.whl
文件示例。
python setup.py sdist # 生成.tar.gz压缩包和.egg-info文件夹
python setup.py bdist_wheel # 生成.whl文件和.egg-info文件夹,没有build文件夹时会生成
python setup.py bdist_egg # 生成.egg文件和.egg-info文件夹,没有build文件夹时会生成
# 可以两个命令写到一行执行
python setup.py sdist bdist_wheel
有一些教程可能会出现python setup.py build
这个步骤,该步骤是构建包/模块,在包同层级创建build文件夹。在使用python setup.py bdist
命令时也会完成相关的功能,构建包并生成build文件夹,故可省略。
运行python setup.py sdist bdist_wheel
结束后(没有bug情况下),在与setup.py
文件同一层级,生成三个文件夹,其中用于上传的两个分发包都在dist
文件夹中,dist
中的两个文件名分别是xindata_package_test-0.0.1.tar.gz
和xindata_package_test-0.0.1-py3-none-any.whl
。
至此,可以进入下一步进行包发布了。
.whl
文件安装下面针对这两个分布包的测试,先将安装目录的Lib\site-packages
下的xindata_package_test
删除。(前面3.2 本地使用测试时,把xindata_package_test
放到了安装目录的Lib\site-packages
下)
然后执行以下命令,安装xindata_package_test
模块(注意切换路径,保证命令能找到.whl
文件)
pip install xindata_package_test-0.0.1-py3-none-any.whl
执行结果没问题(下图1),在安装目录的Lib\site-packages
下,也可以看到有两个文件夹(下图2),测试环境下,调用也正常(下图3)。
.tar.gz
文件安装同样,将刚刚已经安装的xindata_package_test
模块卸载,命令:pip uninstall xindata_package_test
,中间输入y
确认卸载。
卸载完,将xindata_package_test-0.0.1.tar.gz
文件解压到安装目录的Lib\site-packages
下(或者解压完拷贝过去),然后切换路径到……\Lib\site-packages\xindata_package_test-0.0.1
或在该路径下的地址栏输入%comspec%
,回车。
然后执行安装命令:
python setup.py install
执行结果无异常情况下,在安装目录的Lib\site-packages
下,生成一个新的文件xindata_package_test-0.0.1-py3.9.egg
,同时在easy-install.pth
中新增了一行调用的代码:
./xindata_package_test-0.0.1-py3.9.egg
补充说明:
.egg
格式包含项目代码和资源的目录或zip文件,以及包含项目元数据的egg-info
。.egg
格式的项目是在单个目录或文件中自包含的,不与任何其他项目的代码或资源混合在一起,非常适合分发和轻松地卸载或升级代码。easy-install.pth
的功能是使得setuptools
的Easy_Install
工具利用easy-install.pth
文件的“导入”特性来操作sys.path
,确保easy-install.pth
文件中的任何内容可以正常调用,并且总是出现在标准库和本地site-packages目录之前。关于这点,可以通过调用sys.path
查看,代码如下:import sys
print(sys.path)
上传包之前,需要先注册账户、添加API Tokens,然后通过相关的账户密码登录发布。
Python官方提供了一个正式环境和一个测试环境的Pypi,二者是不相通的,需要分别注册。测试环境可用于熟悉上传步骤,当然,上传之后的包都可以下载安装使用。
正式环境和测试环境有一点小差别,测试环境的网址多了一个test.
,其他的基本一致(包括网页等)。
正式环境注册链接:https://pypi.org/account/register/
测试环境注册连接:https://test.pypi.org/account/register/
正式环境生成token:https://pypi.org/manage/account/#api-tokens
测试环境生成token:https://test.pypi.org/manage/account/#api-tokens
官方教程1:https://packaging.python.org/en/latest/tutorials/packaging-projects/
官方教程2:https://packaging.python.org/en/latest/guides/using-testpypi/
注册成功后,需要到个人邮箱点击相关链接验证,完成绑定。完成后,在首页账户设置找到API tokens(或点击上面的生成token链接直达),点击蓝色Add API token按钮准备新增一个token。
注:上传包时,需要输入账户和密码,可以通过token传输,也可以直接使用刚刚注册使用的账户和密码。如果想直接使用注册时的账户和密码,也可以不用生成token。不过推荐使用token,安全性更高。
跳转到以下界面(下图1),填写相关的信息,点击蓝色Add Token按钮会跳转到另外一个界面(下图2),上面记录生成的token,和使用token登录的账户密码的值,该token仅在生成后该界面可见,之后找不回,注意自己保存好。
Token name: 自己随便取个名字
Permissions: Upload packages
Scope: Entire account (all projects)
如果没有twine
模块,需要先安装。该包用于上传包。
pip install twine
注:安装时的一点发现,一开始使用pip install --user twine
进行安装,然后在安装目录下……\Scripts
下生成了一个文件夹,最终把twine.exe
存放在……\Scripts\Python39\Scripts
目录下,卸载之后,使用pip install twine
进行安装,twine.exe
才正常存放在……\Scripts
目录下。
在上一节《模块与包(上)》讲到的Lib\site.py
设置,在USER_SITE
和USER_BASE
默认的情况下,安装命令加上--user
会安装到C:\Users\[你的用户名]\AppData\Roaming\Python\Python xx\
目录下,大概是这个原因吧。--user
本来就是为了解决无权限写入C:\Users\[你的用户名]\AppData
的,所以在设置了Lib\site.py
到安装目录之后,安装时可以不用指定--user
。(当然,在Mac系统可能有不同,如果有什么不同,欢迎留言评论。)
切换路径到包下(2.4打包时有涉及2种切换方法),输入以下命令,回车,再依次输入你的账户和密码(testpypi和pypi的token值是不同的,注意分清),便会出现一个上传的进度条,等待上传完即可。
# 上传到testpypi
twine upload --repository testpypi dist/*
# 上传到pypi
twine upload dist/*
输入密码的时候,会有一个bug:Windows系统使用Ctrl+V不起作用,由于密码没有明文展示,所以看不出来,但是会返回报错:Invalid or non-existent authentication information.(无效或不存在身份验证信息。)这是Python的getpass模块的出现了bug。但token太长,几乎不可能逐个敲!
为了解决这个问题,官方提供了一个解决方案,在命令提示符或PowerShell的属性中,开启使用Ctrl+Shift+C/V作为复制/粘贴的按钮。设置完重启命令提示符或PowerShell便可使用Ctrl+Shift+V粘贴token。具体操作如下:
特别需要注意一点:用管理员身份运行命令提示符或PowerShell,才可使用Ctrl+Shift+V粘贴!!!
参考:https://test.pypi.org/help/#invalid-auth
PS:由于testpypi和pypi网站是国外的网址,连接会比较慢,上传的时候可能会连接超时,多试几次吧。如果翻墙会引发一个网络协议报错,目前为深入研究如何解决,知道的小伙伴可以评论留言,一起学习!
打开命令提示符或终端,输入以下命令,便可安装成功。
pip install xindata_package_test
上面默认从正式环境下载安装包,也可以指定从testpypi下载,命令如下,二者仅是源不同,其他功能不受影响。
pip install xindata_package_test -i https://test.pypi.org/simple/
从正式和测试环境下载安装的包均可正常调用,具体可自行测试,效果如2.4.1,这里不再赘述。
如果是单一模块,发布时会更简单,把相关模块和3个配置文件放在同一个目录下,然后将目录发布即可。拿上面例子来修改做测试,将其他文件全部去掉,仅保留pkg_1.py
,由于和pypi上的包重名,所以名称改为xindata_demo_pkg.py
,结构如下:
# 包结构
xindata_demo_pkg-0.0.1 # 新建文件夹,一般取包名加上版本号
├── LICENSE.txt # 版权声明文件
├── README.md # 包的介绍文件
├── setup.py # 或pyproject.toml,为打包做准备的设置文件
└── xindata_demo_pkg.py # 单个模块
LICENSE.txt
和README.md
同上述2.3的两个文件一致。xindata_demo_pkg.py
的内容和pkg_1.py
一致,如下:
# xindata_demo_pkg.py,同pkg_1.py
file_name = 'package_test.pkg_1'
def test_func():
print('这是package_test.pkg_1.test_func')
class Test_class():
cls_attr = 'package_test.pkg_1.Test_class.cls_attr'
def __init__(self):
self.self_attr = 'package_test.pkg_1.Test_class.self_attr'
def self_func(self):
print('这是package_test.pkg_1.Test_class.self_func')
@classmethod
def cls_func(cls):
print('这是package_test.pkg_1.Test_class.cls_func')
setup.py
文件需要做一些改动,加上py_modules
参数指定呀打包的内容,以下代码第11行。
# setup.py
import setuptools # 导入setuptools打包工具
with open("README.md", "r", encoding="utf-8") as f:
long_description = f.read()
setuptools.setup(
name="xindata_demo_pkg" # 必要参数
,version="0.0.1" # 必要参数,包版本号,便于维护版本
,packages=setuptools.find_packages()# 必要参数,源代码所在文件夹在项目根目录下
,py_modules=["xindata_demo_pkg"] # 指定需打包的.py文件名
,author="Xin_data" # 作者,可以写自己的姓名
,author_email="jaxmin.lee@outlook.com" # 作者联系方式,可写自己的邮箱地址
,description="A test package" # 包的简述
,long_description=long_description # 包的详细介绍,一般在README.md文件内
,long_description_content_type="text/markdown"
,classifiers=[
"Programming Language :: Python :: 3"
,"License :: OSI Approved :: MIT License"
]
,python_requires='>=3.6' # Python版本要求
)
打包和上传的命令同步骤同2.4和2.5。
# 打包命令
python setup.py sdist bdist_wheel
# 上传命令
## 上传到testpypi
twine upload --repository testpypi dist/*
## 上传到pypi
twine upload dist/*
注意:需要切换到setup.py
路径下执行以上命令,切换路径方法可参考2.4内容。
安装之后会生成一个文件和一个文件夹,xindata_demo_pkg.py
文件可以直接调用。
整个模块和包(包含上下两篇)的内容思维导图:
其他分享:在一开始测试的时候我使用的名字是package_test
,但是到了最后一步上传的时候,会报错:Invalid or non-existent authentication information.
,这是因为Pypi已经有一个包名字叫做package_test
,所以后面改为xindata_package_test
。如果要发布某个包,建议先在pypi官网搜索包名,确认不重复之后再继续,以免开发完了,才发现名字重复了,还要返回修改一些配置等。
相关资源:传送门
资源包含打包前的xindata_package_test
和xindata_demo_pkg
,以及打包后的xindata_package_test
和xindata_demo_pkg
。
<下节预告:文件读写>
- End -
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/31 14:17:07- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |