将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 相关文章推荐
使用PDB简单调试Python程序简明指南
Apr 25 Python
python实现获取Ip归属地等信息
Aug 27 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python实现的简单计算器功能详解
Aug 25 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
对Django url的几种使用方式详解
Aug 06 Python
Python使用贪婪算法解决问题
Oct 22 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
django 前端页面如何实现显示前N条数据
Mar 16 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
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
2010/11/25 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
file模式访问网页时iframe高度自适应解决方案
2013/01/16 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
thinkphp实现无限分类(使用递归)
2015/12/19 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
简洁实用的BootStrap jQuery手风琴插件
2016/08/31 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
Angular 4依赖注入学习教程之ClassProvider的使用(三)
2017/06/04 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
vue vantUI实现文件(图片、文档、视频、音频)上传(多文件)
2019/10/15 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
Python中如何获取类属性的列表
2016/12/26 Python
Python自动生产表情包
2017/03/17 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
详解python的ORM中Pony用法
2018/02/09 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
德国网上花店:Valentins
2018/08/15 全球购物
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang
Vue深入理解插槽slot的使用
2022/08/05 Vue.js