当前位置: 移动技术网 > IT编程>脚本编程>Python > setuptools制作whl包实战讲解(一)

setuptools制作whl包实战讲解(一)

2020年07月03日  | 移动技术网IT编程  | 我要评论

什么是 whl

.whl格式的文件本质上是一个压缩包,里面包含了py文件,以及经过编译的pyd文件。使得可以在不具备编译环境的情况下,选择合适自己的python环境进行安装。我们可以使用我们非常熟悉的pip install 来安装whl包。
如:

pip install mask_detect_v1.0.whl

如何制作whl包

setuptools

Setuptools是Python Distutils的加强版,使开发者构建和发布Python包更加容易,特别是当包依赖于其他包时。用setuptools构建和发布的包与用Distutils发布的包是类似的。包的使用者无需安装setuptools就可以使用该包。
文档:
setuptools
文档里的说明还是比较清楚的,本篇文章就以最近做的一个口罩识别项目为例做一个demo,方便自己也方便读者快速你的打whl包。
项目:
Mask-detection-system
目录树
查看项目的工程结构,我们想将所有的python文件和cfg文件夹、weights文件夹,以及一些需要用到的数据如voice文件夹下的wav文件都一并打包到whl包中。
照猫画虎似的,我可以写出这样的setup.py

from setuptools import setup, find_packages

setup(
    name='mask-detection-system-1',
    version='dev_v1.0',
    description='mask detection',
    keywords='mask',
    packages=find_packages(),
    install_requires=[
        'numpy',
        'opencv-python-headless',
        'torch',
        'matplotlib',
        'pycocotools',
        'tqdm',
        'pillow',
        'pydub',
        'pyttsx3'
    ],
        author='CreateLAB',
)

这里需要解释的一个setuptools中的函数就是find_packages(),find_packages()简单的说就是能够查找setup.py所在的根目录下所有的python包。那么什么是python包呢?
包含有__init__.py的文件夹就被称为python包。
使用find_packages()函数能够将根目录下所有的python包都打包起来。这样我就分别在根目录、project文件夹、voice文件夹下都放入了__int__.py,这样我预想就能够实现将所有python文件和音频数据都打包起来的预想。但事实并不是这样。我们可以来看打包后的效果。

python setup.py sdist bdist_wheel

打包好的whl包会出现在dist文件夹中个,我们将其提取,看看里面到底打包了什么?
打包的结果很明显,这与我想要的打包效果不符,主要有以下几个问题:

  • 根目录下的py文件都没有被打包
  • voice文件夹下的音频文件没有被打包
  • 目前只有python文件,那么cfg和weights都没打包进来
    由此可见 find_packages()只能打包python包,python包中只有.py而不包括这个文件夹下 其他的数据文件。并且根目录下的.py文件不会被打包进去。

如何打包数据文件

这里就不得不提到setuptools中 include_package_data、 package_data

  • include_package_data:当指定include_package_data=True时,setuptools会自动提取所有包中所有的指定格式的数据文件,数据文件必须通过MANIFEST.in文件中进行指定。
  • package_data:package_data是一个字典,可以指定想要的数据文件。
    MANIFEST.in的写法:MANIFEST
    我们将include_package_data设为True,并且编写MANIFEST.in
recursive-include ./voice *.wav
recursive-include ./cfg *.cfg
recursive-include ./weights *.pt

将MANIFEST.in放进根目录,再进行打包。奇迹发生了!!!
加入数据文件我们想要的数据文件就这样轻松的被打包进去啦!!!
那么我就在像,这样我们还要package_data干个锤子?我理解这就是两种方法,我们现将MANIFEST.in删除掉。尝试使用package_data来打包数据文件。

from setuptools import setup, find_packages

setup(
    name='mask-detection-system-1',
    version='dev_v1.0',
    description='mask detection',
    keywords='mask',
    packages=find_packages(),
    include_package_data=True,
    package_data={
        # 由于voice是一个包,因此无需指定包名
        "": ["./*.wav"],
        # 而cfg并不是一个包,因此需要指定cfg包名
        "cfg": ["./*.cfg"],
    },
    install_requires=[
        'numpy',
        'opencv-python-headless',
        'torch',
        'matplotlib',
        'pycocotools',
        'tqdm',
        'pillow',
        'pydub',
        'pyttsx3'
    ],
        author='CreateLAB',
)

这样也能够将数据文件进行打包,看过公司工程院大佬写的setup.py,大多数都使用的这种方法,因此我个人认为这种方法更为推荐。

如何打包根目录下的python文件

如果根目录下有python文件怎么办呢?
这就需要介绍scripts参数了,scripts能够指定独立存在的文件,也就是不在包里。
现在我们将setup.py改写成如下

from setuptools import setup, find_packages

setup(
    name='mask-detection-system-1',
    version='dev_v1.0',
    description='mask detection',
    keywords='mask',
    packages=find_packages(),
    include_package_data=True,
    package_data={
        # 由于voice是一个包,因此无需指定包名
        "": ["./*.wav"],
        # 而cfg并不是一个包,因此需要指定cfg包名
        "cfg": ["./*.cfg"],
    },
    scripts=["./detect.py",
             "./models.py",
             "./test.py",
             "./train.py",
             ],
    install_requires=[
        'numpy',
        'opencv-python-headless',
        'torch',
        'matplotlib',
        'pycocotools',
        'tqdm',
        'pillow',
        'pydub',
        'pyttsx3'
    ],
        author='CreateLAB',
)

这回舒服了!已经将项目打包成了我想要的形式。
最终结果当然了,setuptools绝对不只这点玩法,这里我写的就是简单入了个门,希望在自己学会知识的同时能够对其他感兴趣的人有一定的帮助。

本文地址:https://blog.csdn.net/weixin_41722370/article/details/106808509

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网