python打包,上传包知识点学习
python 打包工具推荐
PyPi
PyPI(Python Package Index)是python官方的第三方库的仓库,所有人都可以下载第三方库或上传自己开发的库到PyPI。PyPI推荐使用pip包管理器来下载第三方库
pip可正常工作在Windows、Mac OS、Unix/Linux等操作系统上,但是需要至少2.6+和3.2+的CPython或PyPy的支持。python 2.7.9 和3.4以后的版本已经内置累pip程序,所以不需要安装
安装包的工具
- 使用pip安装来自PyPI的包
- 将virtrualenv或venv用于python环境的应用级隔离
创建包与分发的公工具
- 使用setuptools来定义项目并创建源代码发行版
- 使用wheel而不是egg来创建构建发行版
- 使用twine向PyPI上传包的发行版
pip install安装包与python install安装包的区别
项目配置
组织大型应用的代码的最简单的方法旧式将其分成几个包,这样做将使代码更容易理解,维护和修改,也使每个包的可复用性最大化,就像使用组件一样方便。
setup.py
对于一个需要被分发的包来说,其根目录包含一个setup.py脚本。它定义了distutils模块中描述的所有元数据,并将其合并为标准的setup()函数调用的参数。虽然distutils是一个标准库模块,但还是建议你使用setuptools包来代替,它对标准的distutils做了一些改进。(distutils标准库的增强版,适用于 Python 2.3.5 以上的版本,64 位平台则适用于 Python 2.4 以上的版本)
Distutils使用介绍:https://blog.csdn.net/fireflychh/article/details/80162981
setup()函数,此函数的参数指定了如何配置自己的项目。
命令行工具,包括打包,测试,发布等。可以通过下面的命令查看;python setup.py --help-commands
setup.py文件中至少包含内容如下:
from setuptools import setup setup( name="mypackage" )
name给出了包的全名,该脚本提供了一些命令
standard commands:标准命令,是distutils提供的内置命令
Extra commands:额外命令,是由setuptools这样的第三方包或任何其他定义并注册一个新命令的包所创建的
setup.cfg
setup.cfg文件包含setup.py脚本命令的默认选项,如果构建和分法包的过程很复杂,并且需要像setup.py命令中传入许多可选参数,那么这个文件非常有用,Setup.py先解析setup.cfg文件
关于setup.py和setup.cfg的关系参考:https://blog.csdn.net/joelovegreen/article/details/46373619
setup.cfg的语法与内置configparser模块提供的语法相同,类似与windows平台下的ini文件。
setup.cfg 示例说明:
[global] quiet=1 [sdist] formats=zip,tar [bdist_wheel] universal=1
这个配置示例可以确保源代码发行版是以两种格式创建(ZIP和TAR),并且构建wheel发行版将被创建为通用wheel(与pthon版本无关),此外,由于全局quiet开关,每个命令的大部分输出都将被阻止
MANIFEST.in
此文件在打包的时候告诉setuptools还需要额外打包那些文件
一般情况下,使用sdist命令构建发行版是,distutils将浏览包的目录,查找需要包含在文档中的文件,distutils将包含:
- py_modules,packages,和scripts选项隐含的所有pthon源文件
- ext_modules选项列出的所有C源文件
- 匹配glob模式test/test*.py的文件包括:README,README.txt,setup.py和setup.cfg
- 如果你的包是由svn或CVS管理,那么sdist还将浏览诸如.svn之类的文件夹
如果你还像要包含除disutils包含文件之外的文件使,比如一些静态文件,那么在与setup.py相同的目录中,你可以为MANIFSET文件定义一个名为MANIFEST.in的模板,在其中你可以指定sdist要包含哪些文件
这个模板的每一行都定义一条包含或排除规则,例如:
include HISTORY.txt
include README.txt
include CHANGES.txt
include LICENSE
recursive -include *.txt *.py
参考:http://www.imooc.com/article/253042
trove分离器
pypi和distutils为应用程序的分类提供了一个解决方案,就是使用一套被称为trove分类器。所有分类器都形成一个树状结构,每个分类器都是字符串形式,其中用::字符串分隔每个命名空间,分类器列表在包定义中是作为setup()函数的classifiers参数。例如如下项目的分类其列表:
from setuptools import setup setup( name="solrq", classifiers=[ 'Development Status::4 -Beta', 'License::OSI Approver :: BSD License', 'Operating System :: OS Independent', 'Programing Language :: Python', 'Programing Language :: Python :: 2', 'Programing Language :: Python :: 2.6', ] )
这个参数是可选的,trove还可以提供一些信息:支持的python版本或系统,项目的开发阶段或发布代码所使用的许可证
python命名空间和作用域详解:https://www.jb51.net/article/114951.htm
上传一个包
在pypi上发布自己的包:https://www.cnblogs.com/sting2me/p/6550897.html
一篇非常好的python打包分发文章,内容几乎都囊括而且还易懂:https://blog.csdn.net/chenfeidi1/article/details/80873979
常用工具
PyInstaller
PyInstaller是一个压缩python文件成为可执行程序的一个软件。它会扫描你所有的Python文档,并分析所有代码从而找出所有你的代码运行所需的模块。然后,PyInstaller会将所有这些模块和你的code放在一个文件夹里,或者一个可执行文件里。这样以来,你的用户就不用下载各种你的软件运行环境了,例如各种版本的python,各种不同的python包等等。他们只需要执行打包好的可执行文件就可以使用你的软件了
下面是PyInstaller使用的一个简单示范:
将你的一个python文件:Hello.py打包成可执行文件:
在终端的命令行简单的输入: pyinstaller Hello.py
在当前的文件目录里面,将会生成两个文件夹:build和dist。dist里面就是所有可执行文件了
pyinstaller参数介绍以及总结:https://blog.csdn.net/bearstarx/article/details/81054134
总结Pyinstaller的坑及终极解决方法:https://blog.csdn.net/u012313895/article/details/78271313,https://blog.csdn.net/u014563989/article/details/80940321