将python包发布到PyPI和制作whl文件方式


Posted in Python onDecember 25, 2019

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包发布到PyPI和制作whl文件方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 写入csv乱码问题解决方法
Oct 23 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
对python中dict和json的区别详解
Dec 18 Python
Python Pexpect库的简单使用方法
Jan 29 Python
Python中dict和set的用法讲解
Mar 28 Python
Python 串口读写的实现方法
Jun 12 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
pytorch使用 to 进行类型转换方式
Jan 08 Python
关于Python字符串显示u...的解决方式
Mar 06 Python
python几种常用功能实现代码实例
Dec 25 #Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 #Python
python 实现list或string按指定分段
Dec 25 #Python
python cv2在验证码识别中应用实例解析
Dec 25 #Python
python中的逆序遍历实例
Dec 25 #Python
Win系统PyQt5安装和使用教程
Dec 25 #Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 #Python
You might like
php5.3 废弃函数小结
2010/05/16 PHP
php运行出现Call to undefined function curl_init()的解决方法
2010/11/02 PHP
对PHP语言认识上需要避免的10大误区
2014/06/12 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
PHP7 list() 函数修改
2021/03/09 PHP
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
关于捕获用户何时点击window.onbeforeunload的取消事件
2011/03/06 Javascript
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
解决vue2中使用elementUi打包报错的问题
2020/09/22 Javascript
全面解析Vue中的$nextTick
2020/12/24 Vue.js
python实现颜色rgb和hex相互转换的函数
2015/03/19 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
深入理解NumPy简明教程---数组1
2016/12/17 Python
python使用tkinter实现简单计算器
2018/01/30 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
对python中基于tcp协议的通信(数据传输)实例讲解
2019/07/22 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
物业管理专业个人的自我评价
2013/11/19 职场文书
一位农村小子的自荐信
2014/04/07 职场文书
学生违纪检讨书200字
2014/10/21 职场文书
公开致歉信
2019/06/24 职场文书
九大龙王魂骨,山龙王留下躯干骨,榜首死的最憋屈(被捏碎)
2022/03/18 国漫