• setup.py编写指南


    引言
    • 最近工作遇到要打包模块为whl格式,便于交付部署,总是遇到使用setuptools的地方,在这里简单做一个小结。
    • 主要记录如何编写setup.py的代码,这里以RapidOCR项目为例讲解,力图做到言简意赅,看完可以上手。
    • 相关源码和文件可以在AI Studio这里查看和使用。
    具体讲解
    RapidOCR目录结构如下
    RapidOCR
    ├── config.yaml
    ├── rapidocr_onnxruntime
    │   ├── ch_ppocr_v2_cls
    │   │   ├── config.yaml
    │   │   ├── __init__.py
    │   │   ├── text_cls.py
    │   │   └── utils.py
    │   ├── ch_ppocr_v3_det
    │   │   ├── config.yaml
    │   │   ├── __init__.py
    │   │   ├── text_detect.py
    │   │   └── utils.py
    │   ├── ch_ppocr_v3_rec
    │   │   ├── config.yaml
    │   │   ├── __init__.py
    │   │   ├── text_recognize.py
    │   │   └── utils.py
    │   ├── __init__.py
    │   └── rapid_ocr_api.py
    ├── resources
    │   ├── fonts
    │   │   └── FZYTK.TTF
    │   └── models
    │       ├── ch_ppocr_mobile_v2.0_cls_infer.onnx
    │       ├── ch_PP-OCRv3_det_infer.onnx
    │       └── ch_PP-OCRv3_rec_infer.onnx
    ├── setup.py
    ├── test_demo.py
    └── test_images
        ├── ch_en_num.jpg
        └── single_line_text.jpg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    执行代码
    • 注意:因为rapidocr_onnxruntime模块下有多个字模块,为了可以将rapidocr_onnxruntime作为一个整理打包进去,需要在rapidocr_onnxruntime外面再加一层。具体调整如下:
      rapidocr_onnxruntime/
      ├── __init__.py
      └── rapidocr_onnxruntime
          ├── ch_ppocr_v2_cls
          │   ├── config.yaml
          │   ├── __init__.py
          │   ├── __pycache__
          │   ├── text_cls.py
          │   └── utils.py
          ├── ch_ppocr_v3_det
          │   ├── config.yaml
          │   ├── __init__.py
          │   ├── __pycache__
          │   ├── text_detect.py
          │   └── utils.py
          ├── ch_ppocr_v3_rec
          │   ├── config.yaml
          │   ├── __init__.py
          │   ├── __pycache__
          │   ├── text_recognize.py
          │   └── utils.py
          ├── __init__.py
          ├── __pycache__
          └── rapid_ocr_api.py
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
    • 执行python setup.py bdist_wheel,即可在dist目录下得到rapidocr_onnxruntime-1.0.0-py3-none-any.whl
    预期最终结果
    • 最终目录结构为:
      .
      ├── rapidocr_onnxruntime-1.0.0-py3-none-any.whl
      ├── config.yaml
      ├── resources
      │   ├── fonts
      │   │   └── FZYTK.TTF
      │   └── models
      │       ├── ch_ppocr_mobile_v2.0_cls_infer.onnx
      │       ├── ch_PP-OCRv3_det_infer.onnx
      │       └── ch_PP-OCRv3_rec_infer.onnx
      └── test_demo.py
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 使用:
      • 安装: pip install rapidocr_onnxruntime-1.0.0-py3-none-any.whl
      • 调用:
        import cv2
        from rapidocr_onnxruntime import RapidOCR
        
        rapid_ocr = RapidOCR('config.yaml')
        img = cv2.imread('test_images/ch_en_num.jpg')
        result =  text_sys(img)
        print(result)
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
    setup.py内容讲解
    # setup.py
    import setuptools
    
    module_name = 'rapidocr_onnxruntime'
    
    setuptools.setup(
        name=module_name,
        version='1.0.0',
        platforms="Any",
        author="SWHL",
        author_email="liekkaskono@163.com",
        long_description=get_readme(),
        long_description_content_type='text/markdown',
        description="RapidOCR",
        url="https://github.com/RapidAI/RapidOCR",
        license='Apache-2.0',
        include_package_data=True,
        install_requires=["pyclipper>=1.2.1", 
        				  "onnxruntime>=1.7.0",
                          "opencv_python>=4.5.1.48", 
                          "numpy>=1.19.3",
                          "six>=1.15.0", 
                          "Shapely>=1.7.1"],
        package_dir={'': module_name},
        packages=setuptools.find_packages(where=module_name),
        keywords=[
            'ocr text_detection text_recognition db onnxruntime paddleocr openvino'
        ],
        classifiers=[
            'Programming Language :: Python :: 3.6',
            'Programming Language :: Python :: 3.7',
            'Programming Language :: Python :: 3.8',
            'Programming Language :: Python :: 3.9',
        ],
        extras_require={
            "zope.testbrowser": ["zope.testbrowser>=5.5.1", "lxml>=4.2.4", "cssselect"],
            "django": ["Django>=2.0.6", "lxml>=4.2.4", "cssselect"],
            "flask": ["Flask>=2.0.2", "lxml>=4.2.4", "cssselect"],
            "selenium": ["selenium>=4.1.0,<4.5.0"],
        },
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    参数具体讲解

    以下部分参数内容,可以在pip安装该库之后,通过命令pip show rapidocr_onnxruntime查看。

    • name: package名称,e.g. 具体对应上例就是rapidocr_onnxruntime这个package,里面必须有__init__.py文件。

    • version: package版本号, e.g. ·v0.0.1·

    • author: package作者, e.g. SWHL

    • author_email: 作者邮箱, e.g. liekkaskono@163.com

    • long_description: 该部分内容是pypi包下面的README文件,输入类型是str

    • long_description_content_type: 指定README类型text/markdown,根据所给description来具体指定

    • description: package描述,该部分内容会出现在下面示例图中红框位置:
      在这里插入图片描述

    • url: 项目的github地址或者其他地址,e.g. https://github.com/RapidAI/RapidOCR

    • license: 许可证,需要根据自己情况决定采用哪个许可证, e.g. Apache-2.0

    • python_requires:指定python的版本范围,e.g. python_requires='<=3.7,>=2.7' (大于等于2.7,小于等于3.7)

    • install_requires: 项目依赖的python库,使用pip安装时会自动检查和安装依赖,可以灵活指定库的版本号,e.g. ['numpy>=1.19.5', 'opencv-python==4.4.54.8', 'A>=1, <2']

    • package_dir: 指定package所在的目录,e.g. package_dir={'': 'rapidocr_onnxruntime'}打包时,就会从rapidocr_onnxruntime目录下找寻package

    • packages: 指定要将哪些package打包进去,可以手动指定,也可以自动查找。

      • 手动指定示例:packages=['rapidocr', 'rapidocr.ch_ppocr_v2_cls']
      • 自动查找示例:packages=setuptools.find_packages(where=module_name)find_packages会自动查找where指定目录下的所有package,也就是说会查找指定目录下所有带有__init__.py的目录。
    • keywords: 逗号或空格分割的一系列关于该项目的关键词,e.g. keywords=['ocr text_detection text_recognition db onnxruntime paddleocr openvino']

    • classifiers: 指定一些提示,e.g. classifiers=['Programming Language :: Python :: 3.7',]

    • entry_points: 终端直接运行该库,例如:rapioocr --img_path xxx.jpg

      # rapidocr/rapid_ocr_api.py下必须要有main函数,
      def main():
          parser = argparse.ArgumentParser()
          parser.add_argument('--img_path', type=str, required=True)
          args = parser.parse_args()
          
          text_sys = RapidOCR()
          result = text_sys(args.img_path)
          print(result)
      
      if __name__ == '__main__':
          main()
      
      # setup.py写法:
      entry_points={
          'console_scripts': ['rapid_ocr=rapid_ocr.rapid_ocr_api:main'],
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • include_package_data: 是否将package中相关文件也打包进去

      # 包含指定目录下的所有txt文件
      include_package_data=True,
      package_data={'': ['*.txt']}
      
      • 1
      • 2
      • 3
    • extras_require用法:为库下面指定一些特定领域的包依赖。官网docs | stackoverflow

      pip install xxx[django]
      
      • 1
    参考资料
  • 相关阅读:
    React Native优质开源项目精选
    LLM在电商推荐系统的探索与实践
    axios的两种请求方法
    Leetcode2-AddTwoNumbers
    基于若依ruoyi-nbcio支持flowable流程增加自定义业务表单(一)
    表达式求值——堆栈【做题记录】
    如何快速搭建网站(小白教程)(48小时内完成)
    蓝牙5.0对比4.2的主要优势
    如何实现 Python Switch Case 语句?
    Qt编程,文件操作、UDP通信
  • 原文地址:https://blog.csdn.net/shiwanghualuo/article/details/127887736