Python | setup.py详解

发布时间 2023-07-23 19:40:06作者: 张Zong在修行

setup.py是Python中用于构建、打包和发布第三方库的脚本文件。它通常位于Python库的根目录下,并包含了一些元数据和配置信息,用于指定库的名称、版本、作者、依赖项等。

setup.py的内容通常包括以下部分:

  1. 导入setuptools模块或distutils模块。setuptools是distutils的增强版,提供了更多的功能,比如支持打包和安装egg文件,自动下载依赖项等。
  2. 设置元数据,包括库的名称、版本、作者、描述、许可证等。这些元数据可以在PyPI(Python Package Index)上进行搜索和显示。
  3. 配置依赖项,包括需要安装的Python包、版本号等。这些依赖项会在安装库时自动下载和安装。
  4. 配置入口点,可以指定库的入口点,例如命令行工具。
  5. 配置打包选项,包括要包含的文件、文件类型、排除文件等。
  6. 执行打包操作,通常使用setuptools提供的setup函数。

导入依赖包

1、setuptools包(主要)

from setuptools import setup, find_packages

2、unittest

import unittest

3、codecs

import codecs

setup函数讲解

  • name参数:必选参数,指定库的名称。
name='subword_nmt',
  • version参数:必选参数,指定库的版本号。
version='0.3.8',
  • description参数:可选参数,指定库的简短描述。
description='Unsupervised Word Segmentation for Neural Machine Translation and Text Generation',
  • long_description参数:可选参数,指定库的详细描述。
long_description=(codecs.open("README.md", encoding='utf-8').read() +
                      "\n\n" + codecs.open("CHANGELOG.md", encoding='utf-8').read()),

在这段代码中,使用了Python的codecs模块打开了README.md和CHANGELOG.md文件,并使用utf-8编码读取文件内容。然后,将这两个文件的内容通过字符串拼接的方式合并为一个字符串,并添加了一个换行符作为分隔符。

最终生成的字符串就是库的详细描述,它包含了README.md和CHANGELOG.md文件的内容,方便用户了解库的详细信息。需要注意的是,README.md和CHANGELOG.md文件需要和setup.py文件处于同一目录下。如果你使用其他的文件名或文件路径,需要相应地修改代码。

  • long_description_content_type参数:可选参数,用于指定long_description参数中所包含的文本的类型,通常是一个MIME类型。
long_description_content_type="text/markdown",

这个参数的作用是告诉Python解释器如何解析long_description参数中的文本。如果不指定这个参数,Python解释器会尝试根据文件扩展名来猜测文本类型,但这可能不准确。

常用的long_description_content_type类型包括:

  • text/plain:纯文本格式。
  • text/markdown:Markdown格式。
  • text/x-rst:reStructuredText(RST)格式。
  • text/html:HTML格式。

这样,Python解释器就会正确地解析Markdown格式的文本,并将其显示在PyPI(Python Package Index)上。

  • url参数:可选参数,指定库的主页网址。
url='https://github.com/rsennrich/subword-nmt',
  • author参数:可选参数,指定库的作者名称。
author='Rico Sennrich',
  • author_email参数:可选参数,指定库作者的电子邮件地址。
author_email="thumt17@gmail.com",
  • license参数:可选参数,指定库的许可证类型。
license='MIT',
  • test_suite参数:可选参数,用于指定库测试的主函数,通常是一个字符串,指定测试模块的名称或路径。
test_suite='setup.test_suite',
def test_suite():
    test_loader = unittest.TestLoader()
    test_suite = test_loader.discover('subword_nmt/tests', pattern='test_*.py')

    return test_suite

这段代码定义了一个用于运行测试的主函数test_suite,它使用了Python内置的unittest模块来运行测试。

首先,我们创建了一个TestLoader对象test_loader,它用于加载测试用例。然后,使用test_loader.discover方法来查找指定目录下的测试用例,这里指定了'subword_nmt/tests'目录,并使用通配符模式'test_*.py'来匹配所有以'test_'开头、以'.py'结尾的测试模块。discover方法会递归查找子目录,并返回一个包含所有测试用例的TestSuite对象。

最后,我们将返回的TestSuite对象赋值给test_suite变量,并将其作为主函数的返回值,用于运行所有测试用例。

  • classifiers参数:可选参数,指定库的分类,比如开发状态、支持的Python版本、许可证等。
classifiers=[
    'Intended Audience :: Developers',
    'Topic :: Text Processing',
    'Topic :: Scientific/Engineering :: Artificial Intelligence',
    'License :: OSI Approved :: MIT License',
    'Programming Language :: Python :: 2',
    'Programming Language :: Python :: 3',
    ],

这些标签可以帮助用户更方便地搜索和过滤库,也可以帮助开发者更好地了解库的用途和特性。

classifiers参数通常是一个包含多个字符串的列表,每个字符串表示一个分类标签,格式为'category :: subcategory'。其中,category表示主要分类,例如Intended Audience、Topic、License等;subcategory表示子分类,例如Developers、Text Processing、Artificial Intelligence等。

在这个示例中,我们指定了以下几个分类标签:

  • Intended Audience :: Developers:开发人员。
  • Topic :: Text Processing:文本处理。
  • Topic :: Scientific/Engineering :: Artificial Intelligence:科学/工程:人工智能。
  • License :: OSI Approved :: MIT License:MIT许可证。
  • Programming Language :: Python :: 2:Python 2.x系列。
  • Programming Language :: Python :: 3:Python 3.x系列。

这些分类标签可以帮助用户更方便地搜索和过滤库,例如,用户可以通过pypi.org网站上的分类标签来查找和筛选库,也可以通过pip install命令中的分类标签来安装特定类型的库。

  • install_requires参数:可选参数,指定库的依赖项,这些依赖项会在安装库时自动下载和安装。
install_requires=['mock',
                  'tqdm'],
  • packages参数:可选参数,指定要包含的Python包。
packages=find_packages(),

这段代码使用了setuptools库中的find_packages函数,用于查找和获取当前项目中的所有Python包。

find_packages函数会在当前目录以及其子目录中查找包含__init__.py文件的目录,并返回一个包含所有找到的包名称的列表。这个函数通常用于自动发现和包含所有Python包,无需手动列出每个包的名称。

  • entry_points参数:可选参数,指定库的入口点,例如命令行工具,这些入口点可以在安装库时添加到系统路径中。
entry_points={
        'console_scripts': ['subword-nmt=subword_nmt.subword_nmt:main'],
    },
  • include_package_data参数:可选参数,指定是否包含所有包含在MANIFEST.in文件中的非Python文件。
include_package_data=True
  • scripts参数:可选参数,用于指定要安装的可执行脚本。
scripts=[
    "thumt/scripts/average_checkpoints.py",
    "thumt/scripts/build_vocab.py",
    "thumt/scripts/convert_checkpoint.py",
    "thumt/scripts/shuffle_corpus.py"],

scripts参数通常是一个包含多个字符串的列表,每个字符串表示一个可执行脚本的路径。在安装时,这些脚本会被复制到Python的可执行目录(例如/usr/local/bin或C:\Python27\Scripts)下,用户可以在命令行中直接调用这些脚本来执行相应的操作

在这个示例中,我们指定了以下几个可执行脚本:

  • thumt/scripts/average_checkpoints.py:用于平均多个模型的参数。
  • thumt/scripts/build_vocab.py:用于构建词汇表。
  • thumt/scripts/convert_checkpoint.py:用于将模型的参数从一个格式转换为另一个格式。
  • thumt/scripts/shuffle_corpus.py:用于随机打乱语料库。

这些脚本可以方便用户进行一些常用的操作,可以通过命令行调用,例如:

average_checkpoints.py --inputs checkpoint1,checkpoint2 --num-avg 2 --output averaged_checkpoint

这个命令会读取两个检查点文件checkpoint1和checkpoint2,对它们的参数进行平均,并将结果保存到averaged_checkpoint文件中。

需要注意的是,scripts参数只能用于安装可执行脚本,不能用于安装Python模块或包。如果要安装Python模块或包,需要使用packages参数或者py_modules参数。