Python打包工具

摘要:
通过设置生成分发包设置。py在配置之后。py文件已完成,您可以通过Python将其打包。使用cmd命令行工具打开终端并将其cd以设置。py文件位于一个wheel二进制包中。这需要最新的安装工具和轮子包。执行以下命令以更新python-mpipinstall-user-upgradesetuptoolswheel,执行安装。py文件,指定参数,并指定将其打包为wheel二进制文件pythonsetup。pysdistbdist_ wheel执行命令后,将向目录中添加三个目录。

当我们完成一个完整的项目,需要该项目文件中打包成分发包共享给他人或者上传到pypi社区以供他人下载。这就需要对该项目进行打包分发。

项目文件

这是一个已写好的项目文件包,叫做my_pkg,它的目录结构如下:

tutorial/
    my_pkg/
        __init__.py
        main.py
        utils/
            __init__.py
            other.py

在my_pkg中有两个文件和一个子包utils,现在我们需要对这个my_pkg进行打包。

创建包文件和setup.py文件

my_pkg是将打包的Python包文件,在my_pkg的同级目录下分别创建以下文件:

  • setup.py ---- 打包脚本文件,执行该脚本将自动完成打包
  • LICENCE ---- 许可证文件
  • README ---- 包的介绍和说明

创建后文件目录结构如下:

tutorial/
    my_pkg/
        __init__.py
        main.py
        utils/
            __init__.py
            other.py
    setup.py
    LICENCE
    README

setup.py配置

打开setup.py文件,写入以下内容,

import setuptools      # 导入setuptools, 基于setuptools模块进行打包分发

# 将readme文件中内容加载进来,作为对包的详细说明(可以不需要)
with open("README.md", "r") as fh:  
    long_description = fh.read()

# 调用setuptools的setup进行打包,通过参数配置指定包的信息,这是打包的关键设置
setuptools.setup(
    name="my_pkg", # 这是该包的名字,将来可能使用pip install 该包名直接下载
    version="0.0.1",   #版本号,
    author="Example Author",  #作者
    author_email="author@example.com", # 作者邮箱
    description="A small example package", # 包简短的描述
    long_description=long_description,     # 详细的描述,这里使用从readme中读取的内容
    long_description_content_type="text/markdown",  # 详细描述来源文件的文件类型,这里使用markdomn
    url="https://github.com/pypa/my_pkg",  # 可以将项目上传到github,gitlab等,在此指定链接地址以供下载。

    # 指定需要打包的内容,输入需要打包包名字符串列表,打包时不会自动获取子包,需要手动指定,例如:["my_pkg", "mypkg.utils"]
    packages=setuptools.find_packages(), # 使用该函数可以自动打包该同级目录下所有包
    
    classifiers=[    # 指定一些包的元数据信息,例如使用的协议,操作系统要求
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',   # 该包的Python版本要求
)

这些是对打包行为的一些配置,setup.py中除了上述内容,还可以添加包括以下属性信息

name              package name
version (-V)      package version
fullname          <package name>-<version>
author            the author's name
author-email      the author's email address
maintainer        the maintainer's name
maintainer-email  the maintainer's email address
contact           the maintainer's name if known, else the author's
contact-email     the maintainer's email address if known       
url               the URL for this package
license           the license of the package
licence           for --license
description       the package description
long-description  the long package description
platforms         the list of platforms
classifiers       the list of classifiers
keywords          the list of keywords
provides          the list of packages/modules provided
requires          the list of packages/modules required
obsoletes         the list of packages/modules made obsolete

setup.py配置完成后,就可以执行这个文件进行打包了(在命令行使用Python解释器指定参数执行,不能直接执行),在此之前还有LICENCEREADME两个文件需要完善(也可以不做处理,不影响打包执行)。

README

这个文件是该包的详细说明文件,包括各种信息,例如该包如何安装,需要的环境,如何使用等详细内容。

LICENCE

指定许可证信息,开源软件都遵循了不同的开源协议,这些协议规定了使用者使用该包后必须遵守的原则,可以查看不同开源协议内容 https://choosealicense.com/ ,选则一个协议,复制对应的协议内容到该文件中即可。

通过setup.py生成分发包

setup.py文件配置完成后,就可以通过Python执行进行打包,使用cmd命令行工具打开终端,cd 到setup.py文件所在目录(windows 可以在文件资源管理器中的setup.py目录上方路径中直接cmd,直接在该目录打开终端)

打包成wheel二进制包

这需要最新的setuptools 和 wheel包。执行以下命令更新

python -m pip install --user --upgrade setuptools wheel

执行该setup.py文件并指定参数,指定打包为wheel二进制文件

python setup.py sdist bdist_wheel

执行该命令后,该目录下会多出三个目录。在dist目录下就是我们打包好的源代码文件(tar.gz)和wheel二进制文件(.whl)

build
dist/
    my_pkg-0.0.1.tar.gz              # 被打包内容所有原代码,按照原有的层级结构
    my_pkg-0.0.1-py3-none-any-whl    # 可以通过pip install 直接安装
my_pkg.egg-info

现在我们可以及将这个dist文件夹中的内容共享给他人,也可以上传pypi社区供他人下载安装,在得到这个dist包后,可以通过pip安装命令直接安装内部的.whl文件

pip install my_pkg-0.0.1-py3-none-any-whl

该命令会将这个包安装到python安装目录下/Lib/site-packages目录下,使用pip list命令可以看到在列表中出现了名为my_pkg的包名,安装成功。该包可以使用了。

如果将该包上传到pypi社区供他人下载,需要注意自己包名不要和其他贡献者的包名相同,如何判断是否重复,尝试在未上传前使用pip isntall 包名进行安装,若没有找到找到该package表示该名可用,也可以上pypi官网搜索。上传成功后,直接使用pip install 包名进行安装。上传pypi过程见官网示例https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives

打包为源码包-sdist

通过wheel二进制文件打包是目前较为流行的方式。除了wheel二进制文件,我们还可以使用Python源代码压缩文件形式进行打包。同样在setup.py同级目录下,进入cmd命令行,执行命令

python setup.py sdist

将会在创建dist和my_pkg.egg.info目录。我们只关心dist目录,该目录下有一个压缩文件,这个压缩文件包含了打包后的全部源码。

dist/
    my_pkg-0.0.1.tar.gz

将该文件发送给他人,可以直接使用pip install my_pkg-0.0.1.tar.gz直接安装该包,同样在使用pip list可以查看到该包名。

另外,还可以解压该源码包,在setup.py目录执行python setup.py install安装该包。

二进制安装程序-bdist

打包为二进制安装包,生成目标操作系统的安装程序。

生成windows 安装程序

针对windows环境下,以下三条命令均可

python setup.py bdist_wininst
Python setup.py bdist_msi
python setup.py bdist --format=msi

创建一个dist目录,生成一个安装程序,在Windows上直接双击即可安装该包。

生成rpm包

python setup.py bdist_rpm
python setup.py bdist -- format=rpm

在Linux系统中使用rpm命令进行安装。

生成压缩文件

python setup.py bdist --format=zip
python setup.py bdist --format=gztar

免责声明:文章转载自《Python打包工具》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【windows】Jupyter Notebook 安装与简单使用(pip安装方式) |配置文件存放位置|配置jupyter使用虚拟环境centos7将程序设置为后台运行并说明如何结束后台项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

安装pysqlite2

1. 从https://github.com/msabramo/pysqlite2 下载源码。 2.安装python-dev:sudo apt-get install python-dev否则在 编译或安装过程中,可能会出现 错误:error:Python.h No such file or directory 。注意,不同的Linux发行版的安装命令可...

第一篇 pycharm安装及设置

1.下载pycharm包安装 (1)安装好Python 安装后在命令行中输入python 检查是否安装成功(进入py的交互行) (2)安装好Python 需要两个地方配置到环境变量里面 1.python的安装目录(python.exe在该文件夹中) 2.以及安装目录中的scripts(模块) 2.破解pycharm 3.pycharm的设置 (1)设置通关...

图片转二进制的两种方式

1 //对图片要求不高的时候建议用jpg,要求比较高的时候用png 2 3 //方式一: 4 //let imageData = UIImagePNGRepresentation(image)! 5 6 //方式二: 7 //参数2(comp...

Linux下文件权限:ACL与selinux

经常接触电脑文件的人都会知道在电脑中存在的文件其实是有权限限制的,规定了什么用户拥有什么样的权限;这种设定在Windows和Linux上都可以看到,只是大家经常使用的是win的图像化界面可能感觉不是太明显,如果你经常操作过Linux的命令行界面或者架设网站,可能对文件权限有很深的理解。 接下来,就来说一下在Linux下的文件权限的设定以及原理,Linux下...

Delphi中的操作二进制文件的两个重要函数

Delphi中的操作二进制文件的两个重要函数 对于通过Byte数组进行文件操作的,在FTP中经常会使用到,我也是在Delphi调用Web Service进行文件的上传和下载时找到这两个函数的,挺好用的,推荐给大家。(申明:非本人所写) 1. 将Byte数组生成文件 procedureByteArrayToFile(constByteArray : TB...

linux启动init流程(转)

当系统启动时,首先启动内核,内核调用init来完成引导进程.init启动时,它会在/etc/inittab内查找默认的运行级别:如id:2:initdefault:运行/etc/rc.d/init.d中运行级别为2的启动脚本。由于init.d中的运行级别的这些脚本都用ln 命令连接到/etc/rc.d/rcn.d目录.例如/etc/rc.d/rc2.d/S...