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采集腾讯新闻实例
Jul 10 Python
Python模拟登录12306的方法
Dec 30 Python
Django框架中方法的访问和查找
Jul 15 Python
Python自动化测试Eclipse+Pydev 搭建开发环境
Aug 15 Python
Python中 map()函数的用法详解
Jul 10 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
tensor和numpy的互相转换的实现示例
Aug 02 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
python读取word 中指定位置的表格及表格数据
Oct 23 Python
Django-rest-framework中过滤器的定制实例
Apr 01 Python
django 模版关闭转义方式
May 14 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
Jun 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
实用函数9
2007/11/08 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
php实现json编码的方法
2015/07/30 PHP
详解PHP PDO简单教程
2019/05/28 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
基于JQuery制作的产品广告效果
2010/12/08 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jquery更换文章内容与改变字体大小代码
2013/09/30 Javascript
用js代码改变单选框选中状态的简单实例
2013/12/18 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
JavaScript实现节点的删除与序号重建实例
2015/08/05 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
浅谈redux以及react-redux简单实现
2018/08/28 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
python批量读取txt文件为DataFrame的方法
2018/04/03 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
详细分析Python可变对象和不可变对象
2020/07/09 Python
python如何构建mock接口服务
2021/01/28 Python
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
员工考核评语大全
2014/04/26 职场文书
企业指导教师评语
2014/04/28 职场文书
个性婚礼策划方案
2014/05/17 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
2014企业年终工作总结
2014/12/23 职场文书
办公室主任个人总结
2015/02/28 职场文书
施工现场安全管理制度
2015/08/05 职场文书
了解Redis常见应用场景
2021/06/23 Redis
html原生table实现合并单元格以及合并表头的示例代码
2023/05/07 HTML / CSS