setup.py编写指南

目录

        • 引言
        • 具体讲解
          • RapidOCR目录结构如下
          • 执行代码
          • 预期最终结果
          • 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
执行代码
  • 注意:因为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
    
  • 执行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
    
  • 使用:
    • 安装: 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)
      
setup.py内容讲解
# setup.py
import setuptools

module_name = 'rapidocr_onnxruntime'

setuptools.setup(
    name=module_name,
    version='1.0.0',
    platforms="Any",
    description="RapidOCR",
    author="SWHL",
    author_email="[email protected]",
    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',
    ]
)
参数具体讲解

以下部分参数内容,可以在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. [email protected]
  • description: package描述, e.g. RapidOCR
  • 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']
  • 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'],
    }
    
  • include_package_data: 是否将package中相关文件也打包进去
    # 包含指定目录下的所有txt文件
    include_package_data=True,
    package_data={'': ['*.txt']}
    

参考资料

  • 官方文档

你可能感兴趣的:(工具,python,setuptools,whl)