python setuptools模块介绍

python setuptools模块介绍

文章目录

  • 模块介绍
  • 配置setup文件
  • 参数说明
    • 3.1 find_packages
    • 3.2 package_data
      • 方法1)
      • 方法2)
      • 方法3):自动识别,多层package都可以处理
      • 方法4):
  • 安装并执行

  1. 模块介绍

    setuptools是python distutils的加强版,使开发者构建和发布python包更加容易,特别是当包依赖于其他包时。用setuptools构建和发布的包与distutils发布的包类似。包的使用者无需安装setuptools就可以使用该包。

  2. 配置setup文件

    from setuptools import setup, find_packages
    import sys, os
    import re
    import time
    
    with open('README.md', 'rb') as f:
        readme = f.read().decode('utf-8')
    
    install_requires = []
    with open('requirements.txt', 'rb') as f:
        for req in f.readlines():
        	install_requires.append(req.strip())
    
    setup(
        name='Personas',	#包名
        version='0.0.1',	#版本信息
        description='persons_tools',
        long_description=readme,
        author='xxx',
        author_email='[email protected]',
        install_requires=install_requires,	# 安装依赖的其他包
        packages= find_packages(exclude=['ez_setup', 'examples', 'tests']),	#要(include)打包(exclude不要打包)的项目文件夹
        package_data = {
            'conf':'conf/*',
            'service.personas_flask.models.incom':'service/personas_flask/models/incom/*',
            'service.personas_flask.models.industry':'service/personas_flask/models/industry/*',
            'service.personas_flask.models.profession':'service/personas_flask/models/profession/*',
            'personas.labels_pool.conf':'personas/labels_pool/conf/*',
        },
        scripts=["personas/personas_calculate.py"],
        zip_safe=False,	# 设定项目包为不安全,需要每次都检测其安全性
        include_package_data=True,	# 自动打包文件夹内所有数据
    )
    
  3. 参数说明

    3.1 find_packages

    find_packages的参数有:一个源码目录,一个include包名目录,一个exclude包名目录。如果这些参数被忽略,则源码目录默认是setup.py脚本所在的目录。该函数返回一个列表,可以赋值给package参数。

    有些工程可能会使用src或者lib目录作为源码树的子目录,因此这些工程中,需要使用“src"或者”lib"作为find_packages()的第一个参数,当然,这种情况下还需要设置package_dir={"": “lib”},否则会报错

    from setuptools import setup, find_packages
    setup(
        name = "HelloWorld",
        version = "0.1",
        package_dir = {'':'lib'},
        packages = find_packages('lib'),
    )
    

    find_packages()函数遍历目标目录,根据include参数进行过滤,寻找python包。对于python3.2以及之前的版本,只有包含__init__.py文件的目录才会被当做包。最后,对得到的结果进行过滤,去掉匹配exclude参数的包。

    include和exclude参数是包名的列表,包名中的"."表示父子关系。

    lib/
        foo.py
        __init__.py
        bar/
            __init__.py
            bar.py
    

    则find_packages(exclude=[“lib”])(或者packages = find_packages(include=[“lib”])),只是排除(或包含)lib包,但是却不会排除(包含)lib.bar包。

    3.2 package_data

    方法1)

    setup {
       package_data = ['', ['*.txt']]
    }
    

    目的是打包时把txt文件放进去

    方法2)

    from setuptools import setup, find_packages
    setup(
        ...
        package_data = {
            # 任何包如果包含 *.txt or *.rst 文件都加进去,可以处理多层package目录结构
            '': ['*.txt', '*.rst'],
            # 如果hello包下面有*.msg文件也加进去
    		'hello': ['*.msg'],
        }
    )
    

    方法3):自动识别,多层package都可以处理

    from setuptools import setup, find_packages
    setup(
        ...
        include_package_data = True
    )
    

    会搜索所有package的所有数据文件,这种方法比较省事

    方法4):

    数据位于package的子目录中,采用手工设置的方法,比如在mypkg的data目录下,可以这样做:

    from setuptools import setup, find_packages
    setup(
        ...
        packages = find_packages('src'),  # include all packages under src
        package_dir = {'':'src'},   # tell distutils packages are under src
    
        package_data = {
            # If any package contains *.txt files, include them:
            '': ['*.txt'],
            # And include any *.dat files found in the 'data' subdirectory
            # of the 'mypkg' package, also:
            'mypkg': ['data/*.dat'],
        }
    )
    
  4. 安装并执行

    • 安装:python setup.py install
    • 执行:python setup.py sdist会在dist文件夹生成项目的压缩包
    • 执行:python setup.py bdist_wininst会生成exe安装文件

你可能感兴趣的:(python基础)