Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解


Posted in Python onFebruary 12, 2020

wheel文件

Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改为.zip即可可看到压缩包里面的内容。按照官网说法,wheels是发行版Python的新标准并且要取代.egg。

Egg格式是由setuptools在2004年引入,而Wheel格式是由PEP427在2012年定义。 Wheel现在被认为是Python的二进制包的标准格式。

以下是Wheel和Egg的主要的不同点:

Wheel有一个官方的PEP427来定义,而Egg没有PEP定义。

Wheel是一种分发格式,即打包格式。而Egg既是一种分发格式,也是一种 运行时安装的格式,并且是可以被import的。

Wheel文件不会包含.pyc文件

Wheel使用和PEP376兼容的.dist-info目录,而Egg使用.egg-info目录。

Wheel有着更丰富的命名规则。

Wheel是有版本的,每个Wheel文件都包含wheel规格的版本和打包它的实现。

Wheel在内部被sysconfig path type管理,因此转向其他格式也更容易。

distutils和setuptools工具

用来Python环境中构建和安装额外的模块,模块可以基于Python,也可以C/C++写的扩展模块,可以是python包,包中包含了C和Python编写的模块。

setuptools是 Python Enterprise Application Kit(PEAK)的一个副项目,它是一组Python的 distutilsde工具的增强版(适用于 Python 2.3.5 以上的版本,64 位平台则适用于 Python 2.4 以上的版本),可以让程序员更方便的创建和发布 Python 包,特别是那些对其它包具有依赖性的状况。

setuptools重点在于setup.py文件编写:

setup.py参数介绍:

name : 打包起来的包的文件名

version : 版本号,添加为打包文件的后缀名

author : 作者

author_email : 作者的邮箱

py_modules : 打包的.py文件

packages: 打包的python文件夹

include_package_data : 项目里会有一些非py文件,比如html和js等,这时候就要靠include_package_data 和 package_data 来指定了。package_data:一般写成{‘your_package_name': [“files”]}, include_package_data还没完,还需要修改MANIFEST.in文件.MANIFEST.in文件的语法为: include xxx/xxx/xxx/.ini/(所有以.ini结尾的文件,也可以直接指定文件名)

license : 支持的开源协议

description : 对项目简短的一个形容

ext_modules : 是一个包含Extension实例的列表,Extension的定义也有一些参数。

ext_package : 定义extension的相对路径

requires : 定义依赖哪些模块

provides : 定义可以为哪些模块提供依赖

data_files :指定其他的一些文件(如配置文件),规定了哪些文件被安装到哪些目录中。如果目录名是相对路径,则是相对于sys.prefix或sys.exec_prefix的路径。如果没有提供模板,会被添加到MANIFEST文件中。

将python文件(.py)封装成可安装使用的模块

参考:https://docs.python.org/3.6/distutils/introduction.html#distutils-simple-example

printtest.py

def test():

  print('print test')

将以上.py文件做成python模块,需要在相同目录下创建setup.py文件,setup.py中输入配置信息:

from setuptools import setup

setup(name='printtest',

   version='1.0',

   py_modules=['printtest'],

   )

打开终端,定位到该文件夹下,输入:

python setup.py sdist

此时在目录中生成dist文件夹,文件夹中有testpg-1.0.tar.gz文件,用户安装的话只需要testpg-1.0.tar.gz文件即可。

将此文件解压得到testpg-1.0文件夹,会发现该文件夹有我们刚刚书写的3个py文件,还有一个PKG-INFO,打开该文件,会显示该模块的具体信息:由于我们没有设置,所以为UNKOWN

Metadata-Version: 1.0

Name: printtest

Version: 1.0

Summary: UNKNOWN

Home-page: UNKNOWN

Author: UNKNOWN

Author-email: UNKNOWN

License: UNKNOWN

Description: UNKNOWN

Platform: UNKNOWN

终端定位到此文件夹下,输入以下命令,模块将会被安装到解释器对应的Lib/site-packages目录下:

python setup.py install

安装后,会发现Lib/site-packages目录下存在printtest.py文件和printtest-1.0-py3.6.egg-info

应用:

import printtest

printtest.test()

输出:

print test

封装Python包

导入单个Python文件时成为Python模块,而包含多个Python文件的文件夹成为一个Python包。本节主要讲述怎样封装一个Python包。

1.创建一个文件夹,将需要封装的pagtest文件夹(里面为.py文件,需要包括一个__init__.py文件,内容可以为空)放到该文件夹中,然后创建setup.py文件对包进行配置:

from setuptools import setup
setup(name='pagtest',
   version='1.0.0',
   description='A print test for PyPI',
   author='winycg',
   author_email='win@163.com',
   url='https://www.python.org/',
   license='MIT',
   keywords='ga nn',
   project_urls={
      'Documentation': 'https://packaging.python.org/tutorials/distributing-packages/',
      'Funding': 'https://donate.pypi.org',
      'Source': 'https://github.com/pypa/sampleproject/',
      'Tracker': 'https://github.com/pypa/sampleproject/issues',
   },
   packages=['pagtest'],
   install_requires=['numpy>=1.14', 'tensorflow>=1.7'],
   python_requires='>=3'
   )

2.创建README.txt文件用于对文件的安装以及使用信息做描述

3.目前文件夹的目录的架构为:

pagtest/

    __init__.py

    print1.py

    print2.py

setup.py

README.txt

输入以下命令进行打包,制作source distribution(源代码发布包),此命令将会把所有内容在dist/目录打包为pagtest-1.0.0.tar.gz

python setup.py sdist

4.上传到PyPI上。上传时,可以建立一个账户验证文件~/.pypirc(Windows不可以,因为文件命名中含有非法字符),也可以在上传时输入账户和密码。

[distutils]

index-servers=pypi

[pypi]

repository = https://upload.pypi.org/legacy/

username = <username>

password = <password>

5.将命令行定位到此文件夹下,输入命令对dist目录下的pagtest-1.0.0.tar.gzt包进行上传,twine为Python包需要安装:

twine upload dist/*

制作python包为wheel文件

wheel是一个已经编译好的包,在安装时不需要编译过程,安装whl文件时要比发布的源文件安装要快。

在如上第2步后,输入如下命令即可在生成.whl

python setup.py bdist_wheel

.whl文件在dist目录下,上传到PyPI:

twine upload dist/*

更新Python包

修改setup.py中的版本号,然后直接上传即可

更多关于Python打包模块wheel的使用方法请查看下面的相关链接

Python 相关文章推荐
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
pip安装Python库时遇到的问题及解决方法
Nov 23 Python
Python实现Pig Latin小游戏实例代码
Feb 02 Python
python学生信息管理系统(完整版)
Apr 05 Python
Python图像处理之图像的读取、显示与保存操作【测试可用】
Jan 04 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
Feb 28 Python
Django model.py表单设置默认值允许为空的操作
May 19 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
Python截图并保存的具体实例
Jan 14 Python
Python利用folium实现地图可视化
May 23 Python
Python sep参数使用方法详解
Feb 12 #Python
Python多重继承之菱形继承的实例详解
Feb 12 #Python
Python实现桌面翻译工具【新手必学】
Feb 12 #Python
PyCharm无法引用自身项目解决方式
Feb 12 #Python
pycharm不能运行.py文件的解决方法
Feb 12 #Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 #Python
pytorch中使用cuda扩展的实现示例
Feb 12 #Python
You might like
PHP中文件上传的一个问题
2010/09/04 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
浅谈PHP中类和对象的相关函数
2017/04/26 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
javascript 实现字符串反转的三种方法
2013/11/23 Javascript
解决JQeury显示内容没有边距内容紧挨着浏览器边线
2013/12/20 Javascript
js使用html()或text()方法获取设置p标签的显示的值
2014/08/01 Javascript
jQuery中clearQueue()方法用法实例
2014/12/29 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
python元组的概念知识点
2019/11/19 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
python/golang实现循环链表的示例代码
2020/09/14 Python
python3判断IP地址的方法
2021/03/04 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
销售自荐信
2013/10/22 职场文书
校园联欢晚会主持词
2014/03/17 职场文书
大四毕业生自荐书
2014/07/05 职场文书
2015年食品安全工作总结
2015/05/15 职场文书
JS Canvas接口和动画效果大全
2021/04/29 Javascript