Skip to main content

10. API参考

10.1. distutils.core — Core Distutils功能

distutils.core 模块是需要安装才能使用Distutils的唯一模块。它提供 setup() (从安装脚本调用)。间接提供 distutils.dist.Distributiondistutils.cmd.Command 类。

distutils.core.setup(arguments)

基本的do-everything函数,做你可以从Distutils方法要求的大多数一切。

设置函数需要大量的参数。这些在下表中列出。

参数名称

类型

name

包的名称

一个字符串

version

包的版本号;见 distutils.version

一个字符串

description

描述包的单行

一个字符串

long_description

包的更长描述

一个字符串

author

包作者的名称

一个字符串

author_email

软件包作者的电子邮件地址

一个字符串

maintainer

当前维护者的名称,如果与作者不同。注意,如果提供了维护者,distutils将使用它作为 PKG-INFO 中的作者

一个字符串

maintainer_email

当前维护者的电子邮件地址,如果与作者不同

一个字符串

url

包的网址(首页)

一个字符串

download_url

用于下载软件包的URL

一个字符串

packages

distutils将操作的Python包列表

字符串列表

py_modules

distutils将操作的Python模块的列表

字符串列表

scripts

要构建和安装的独立脚本文件的列表

字符串列表

ext_modules

要构建的Python扩展列表

distutils.core.Extension 实例的列表

classifiers

包的类别列表

字符串列表;有效分类器在 PyPI 上列出。

distclass

Distribution 类使用

distutils.core.Distribution 的子类

script_name

setup.py脚本的名称 - 默认为 sys.argv[0]

一个字符串

script_args

要提供给设置脚本的参数

字符串列表

options

安装脚本的默认选项

一本字典

license

包的许可证

一个字符串

keywords

描述性元数据,参见 PEP 314

字符串列表或逗号分隔的字符串

platforms

 

字符串列表或逗号分隔的字符串

cmdclass

命令名称到 Command 子类的映射

一本字典

data_files

要安装的数据文件的列表

一个列表

package_dir

包到目录名的映射

一本字典

distutils.core.run_setup(script_name[, script_args=None, stop_after='run'])

在受控制的环境中运行安装脚本,并返回驱动事物的 distutils.dist.Distribution 实例。如果您需要查找分发元数据(作为关键字args从 script 传递到 setup())或配置文件或命令行的内容,这将非常有用。

script_name 是将使用 exec() 读取和运行的文件。在通话期间,sys.argv[0] 将被 script 取代。 script_args 是字符串列表;如果提供,sys.argv[1:] 将在呼叫期间被 script_args 替换。

stop_after 告诉 setup() 何时停止处理;可能值:

描述

init

在创建 Distribution 实例并使用关键字参数填充到 setup() 后停止

config

停止配置文件已解析(并且其数据存储在 Distribution 实例中)

commandline

在命令行(sys.argv[1:]script_args)已解析(并且数据存储在 Distribution 实例中)后停止。

run

在所有命令都运行后停止(就像 setup() 以通常的方式调用一样)。这是默认值。

此外,distutils.core 模块暴露了存在于其他地方的一些类。

下面简要描述每一个,但是查看相关模块的完整参考。

class distutils.core.Extension

Extension类在安装脚本中描述了单个C或C++扩展模块。它在其构造函数中接受以下关键字参数:

参数名称

类型

name

扩展的全名,包括任何包 - 即。 not 文件名或路径名,但是Python点名

一个字符串

sources

源文件名列表,相对于分发根(安装脚本所在的位置),以Unix形式(斜杠分隔)表示可移植性。源文件可以是C,C++,SWIG(.i),特定于平台的资源文件或者由 build_ext 命令识别为Python扩展的源的任何东西。

字符串列表

include_dirs

搜索C/C++头文件的目录列表(以Unix形式表示可移植性)

字符串列表

define_macros

要定义的宏列表;每个宏都使用2元组 (name, value) 定义,其中 value 是定义它的字符串或 None 来定义它没有特定的值(在源代码中等价于 #define FOO,在Unix C编译器命令行中等价于 -DFOO

一个元组列表

undef_macros

列表以明确地定义

字符串列表

library_dirs

在链接时搜索C/C++库的目录列表

字符串列表

libraries

链接到的库名称(不是文件名或路径)的列表

字符串列表

runtime_library_dirs

在运行时搜索C/C++库的目录列表(对于共享扩展,这是扩展加载时)

字符串列表

extra_objects

要链接的额外文件列表(例如,’sources’不包含的目标文件,必须明确指定的静态库,二进制资源文件等)

字符串列表

extra_compile_args

在“源”中编译源文件时使用的任何额外的平台和编译器特定信息。对于命令行有意义的平台和编译器,这通常是命令行参数的列表,但对于其他平台,它可以是任何东西。

字符串列表

extra_link_args

在将对象文件链接到一起以创建扩展(或创建新的静态Python解释器)时使用的任何额外的平台和编译器特定信息。与’extra_compile_args’类似的解释。

字符串列表

export_symbols

要从共享扩展导出的符号列表。不是在所有平台上使用,通常不需要Python扩展,通常只导出一个符号:init + extension_name。

字符串列表

depends

扩展依赖的文件列表

字符串列表

language

扩展语言(即 'c''c++''objc')。如果未提供,将从源扩展中检测。

一个字符串

optional

指定扩展中的构建失败不应中止构建过程,而只是跳过扩展。

一个布尔值

class distutils.core.Distribution

Distribution 描述了如何构建,安装和打包Python软件包。

有关由Distribution构造函数接受的关键字参数的列表,请参阅 setup() 函数。 setup() 创建一个分布实例。

class distutils.core.Command

Command 类(或者更确切地说,它的一个子类的实例)实现单个distutils命令。

10.2. distutils.ccompiler — CCompiler基类

这个模块提供了 CCompiler 类的抽象基类。 CCompiler 实例可用于构建单个项目所需的所有编译和链接步骤。提供了为编译器设置选项的方法 - 宏定义,包括目录,链接路径,库等。

此模块提供以下功能。

distutils.ccompiler.gen_lib_options(compiler, library_dirs, runtime_library_dirs, libraries)

生成用于搜索库目录和与特定库链接的链接器选项。 librarieslibrary_dirs 分别是库名(而不是文件名!)和搜索目录的列表。返回适用于某些编译器的命令行选项列表(取决于传入的两个格式字符串)。

distutils.ccompiler.gen_preprocess_options(macros, include_dirs)

生成由至少两种类型的编译器使用的C预处理器选项(-D-U-I):典型的Unix编译器和Visual C++。 macros 是通常的事情,即1或2元组的列表,其中 (name,) 意味着未定义(-U)宏 name,并且 (name, value) 意味着定义(-D)宏 namevalueinclude_dirs 只是要添加到头文件搜索路径(-I)的目录名称列表。返回适用于Unix编译器或Visual C++的命令行选项列表。

distutils.ccompiler.get_default_compiler(osname, platform)

确定用于给定平台的默认编译器。

osname 应该是标准的Python操作系统名称之一(即 os.name 返回的名称),platformsys.platform 为所讨论的平台返回的公共值。

如果未给出参数,默认值为 os.namesys.platform

distutils.ccompiler.new_compiler(plat=None, compiler=None, verbose=0, dry_run=0, force=0)

工厂函数为所提供的平台/编译器组合生成一些CCompiler子类的实例。 plat 默认为 os.name (例如,'posix''nt'),并且 compiler 默认为该平台的默认编译器。目前只支持 'posix''nt',默认编译器是“传统的Unix接口”(UnixCCompiler 类)和Visual C++(MSVCCompiler 类)。注意,完全有可能在Windows下请求一个Unix编译器对象,在Unix下请求一个Microsoft编译器对象—如果您为 compiler 提供一个值,plat 将被忽略。

distutils.ccompiler.show_compilers()

可用编译器的打印列表(--help-compiler 选项用于 buildbuild_extbuild_clib)。

class distutils.ccompiler.CCompiler([verbose=0, dry_run=0, force=0])

抽象基类 CCompiler 定义了必须由真正的编译器类实现的接口。该类还有一些实用程序方法由几个编译器类使用。

编译器抽象类背后的基本思想是每个实例可以用于构建单个项目的所有编译/链接步骤。因此,所有这些编译和链接步骤共有的属性 - 包括目录,要定义的宏,链接的库等等—是编译器实例的属性。为了允许如何处理单个文件的可变性,这些属性中的大多数可以在每个编译或每个链接的基础上变化。

每个子类的构造函数创建一个Compiler对象的实例。标志是 verbose (显示详细输出),dry_run (不实际执行步骤)和 force (重建一切,不管依赖)。所有这些标志默认为 0 (off)。请注意,您可能不想直接实例化 CCompiler 或其子类之一 - 使用 distutils.CCompiler.new_compiler() 工厂函数。

以下方法允许您手动更改编译器类的实例的编译器选项。

add_include_dir(dir)

dir 添加到将要搜索头文件的目录列表中。指示编译器按照它们由连续调用 add_include_dir() 提供的顺序搜索目录。

set_include_dirs(dirs)

将要搜索的目录列表设置为 dirs (字符串列表)。覆盖任何先前对 add_include_dir() 的调用;对 add_include_dir() 的后续调用添加到传递给 set_include_dirs() 的列表。这不影响编译器可以默认搜索的任何标准包含目录的列表。

add_library(libname)

libname 添加到将包含在由此编译器对象驱动的所有链接中的库列表。注意,libname 应该*不是*是包含库的文件的名称,而是库本身的名称:实际的文件名将由链接器,编译器或编译器类推断(取决于平台) 。

将指示链接器按照它们提供给 add_library() 和/或 set_libraries() 的顺序链接库。重复库名称是完全有效的;链接器将被指示链接库,因为它们被提及的次数。

set_libraries(libnames)

将要由此编译器对象驱动的所有链接中包含的库列表设置为 libnames (字符串列表)。这不影响链接器默认包含的任何标准系统库。

add_library_dir(dir)

dir 添加到要搜索指定给 add_library()set_libraries() 的库的目录列表中。将指示链接器按照它们提供给 add_library_dir() 和/或 set_library_dirs() 的顺序搜索库。

set_library_dirs(dirs)

将库搜索目录的列表设置为 dirs (字符串列表)。这不会影响链接器默认搜索的任何标准库搜索路径。

add_runtime_library_dir(dir)

dir 添加到将在运行时搜索共享库的目录列表中。

set_runtime_library_dirs(dirs)

设置目录列表以在运行时搜索共享库到 dirs (字符串列表)。这不影响运行时链接器默认搜索的任何标准搜索路径。

define_macro(name[, value=None])

为由此编译器对象驱动的所有编译定义预处理器宏。可选参数 value 应为字符串;如果没有提供,则宏将被定义为没有显式值,确切的结果取决于所使用的编译器。

undefine_macro(name)

为由此编译器对象驱动的所有编译,定义一个预处理器宏。如果相同的宏由 define_macro() 定义并且未由 undefine_macro() 定义,则最后一个调用优先(包括多个重新定义或不定义)。如果宏在每次编译的基础上重新定义/未定义(即在 compile() 的调用中),那么它优先。

object 添加到要包括在由此编译器对象驱动的每个链接中的对象文件(或类似物,例如显式命名的库文件或“资源编译器”的输出)的列表中。

将要包括在每个链接中的对象文件(或类似物)的列表设置为 objects。这不影响链接器可能默认包括的任何标准对象文件(例如系统库)。

以下方法实现自动检测编译器选项的方法,提供类似于GNU autoconf 的一些功能。

detect_language(sources)

检测给定文件或文件列表的语言。使用实例属性 language_map (字典)和 language_order (列表)来执行作业。

find_library_file(dirs, lib[, debug=0])

在指定的目录列表中搜索静态或共享库文件 lib,并返回该文件的完整路径。如果 debug 为true,请查找调试版本(如果这在当前平台上有意义)。如果在任何指定的目录中找不到 lib,则返回 None

has_function(funcname[, includes=None, include_dirs=None, libraries=None, library_dirs=None])

返回一个布尔值,指示当前平台上是否支持 funcname。可选参数可用于通过提供其他include文件和路径以及库和路径来扩充编译环境。

library_dir_option(dir)

返回编译器选项以将 dir 添加到搜索库的目录列表中。

library_option(lib)

返回编译器选项以将 lib 添加到链接到共享库或可执行文件的库列表中。

runtime_library_dir_option(dir)

返回编译器选项以将 dir 添加到搜索运行时库的目录列表中。

set_executables(**args)

定义将运行以执行编译的各个阶段的可执行文件(及其选项)。这里可能指定的可执行程序的确切集合取决于编译器类(通过’executables’类属性),但大多数将有:

属性

描述

compiler

C/C++编译器

linker_so

链接器用于创建共享对象和库

linker_exe

链接器用于创建二进制可执行文件

archiver

静态库创建者

在具有命令行(Unix,DOS/Windows)的平台上,每个都是一个字符串,将被分成可执行文件名和(可选)参数列表。 (拆分字符串与Unix shell操作类似:字由空格分隔,但引号和反斜杠可以覆盖此字符。请参阅 distutils.util.split_quoted()。)

以下方法调用构建过程中的阶段。

compile(sources[, output_dir=None, macros=None, include_dirs=None, debug=0, extra_preargs=None, extra_postargs=None, depends=None])

编译一个或多个源文件。生成目标文件(例如将 .c 文件转换为 .o 文件)。

sources 必须是文件名列表,很可能是C/C++文件,但实际上可以由特定编译器和编译器类处理(例如,MSVCCompiler 可以处理 sources 中的资源文件)。返回对象文件名列表,每个源文件名一个 sources。根据实现,并不是所有的源文件都必须被编译,而是返回所有相应的对象文件名。

如果给出 output_dir,则将目标文件放在其下,同时保留它们的原始路径分量。也就是说,foo/bar.c 通常编译为 foo/bar.o (对于Unix实现);如果 output_dirbuild,那么它将编译为 build/foo/bar.o

macros,如果给出,必须是一个宏定义的列表。宏定义是 (name, value) 2元组或 (name,) 1元组。前者定义了一个宏;如果值为 None,则在没有显式值的情况下定义宏。 1元组情况未定义宏。稍后定义/重新定义/取消定义优先。

如果给出了 include_dirs,则必须是字符串列表,要添加到缺省的目录包含仅用于此编译的文件搜索路径。

debug 是一个布尔值;如果为真,则将指示编译器在目标文件中(或旁边)输出调试符号。

extra_preargsextra_postargs 是实现相关的。在具有命令行概念的平台(例如Unix,DOS/Windows)上,它们很可能是字符串列表:额外的命令行参数,用于预编译/附加到编译器命令行。在其他平台上,请参阅实现类文档。无论如何,当抽象编译器框架不切割芥末的时候,它们被用作逃逸舱口。

depends (如果给出)是所有目标依赖的文件名列表。如果源文件比depends中的任何文件旧,则源文件将被重新编译。这支持依赖性跟踪,但只有粗粒度。

对失败提出 CompileError

create_static_lib(objects, output_libname[, output_dir=None, debug=0, target_lang=None])

链接一堆东西在一起创建一个静态库文件。 “一堆东西”包括作为 objects 提供的目标文件的列表,提供给 add_link_object() 和/或 set_link_objects() 的额外目标文件,提供给 add_library() 和/或 set_libraries() 的库和作为 libraries 提供的库(如果有的话)。

output_libname 应该是一个库名,而不是文件名;将从库名称推断文件名。 output_dir 是库文件所在的目录。

debug 是一个布尔值;如果为true,调试信息将包含在库中(请注意,在大多数平台上,这是编译步骤,这里的重要:debug 标志包含在这里只是为了一致性)。

target_lang 是编译给定对象的目标语言。这允许特定语言的特定链接时间处理。

对失败提出 LibError

将一堆东西链接在一起以创建可执行文件或共享库文件。

“堆的东西”包括作为 objects 提供的对象文件的列表。 output_filename 应该是一个文件名。如果提供 output_diroutput_filename 是相对的(即如果需要,output_filename 可以提供目录组件)。

libraries 是要链接的库的列表。这些是库名,而不是文件名,因为它们以平台特定的方式转换为文件名(例如,foo 在Unix上变为 libfoo.a,在DOS/Windows上变为 foo.lib)。但是,它们可以包括目录组件,这意味着链接器将查找该特定目录,而不是搜索所有正常位置。

library_dirs (如果提供)应该是用于搜索指定为裸库名称(即没有目录组件)的库的目录列表。这些在系统默认的顶部,并提供给 add_library_dir() 和/或 set_library_dirs()runtime_library_dirs 是将嵌入到共享库中的目录列表,用于搜索*它*在运行时依赖的其他共享库。 (这可能只与Unix相关。)

export_symbols 是共享库将导出的符号列表。 (这似乎只在Windows上相关。)

debugcompile()create_static_lib() 一样,有些微小的区别在于它在大多数平台上都是重要的(与 create_static_lib() 相反,debug 标志主要是为了形式)。

extra_preargsextra_postargscompile() 一样(当然,它们为所使用的特定链接器提供命令行参数)。

target_lang 是编译给定对象的目标语言。这允许特定语言的特定链接时间处理。

对失败提出 LinkError

链接可执行文件。 output_progname 是文件可执行文件的名称,而 objects 是要链接的对象文件名的列表。其他参数与 link() 方法相同。

链接共享库。 output_libname 是输出库的名称,而 objects 是要链接的对象文件名的列表。其他参数与 link() 方法相同。

链接共享对象。 output_filename 是将要创建的共享对象的名称,而 objects 是要链接的对象文件名的列表。其他参数与 link() 方法相同。

preprocess(source[, output_file=None, macros=None, include_dirs=None, extra_preargs=None, extra_postargs=None])

预处理单个C/C++源文件,在 source 中命名。输出将写入名为 output_file 的文件,如果 output_file 未提供,则输出为 stdoutmacroscompile() 的宏定义的列表,其将用 define_macro()undefine_macro() 扩充宏集合。 include_dirs 是将被添加到默认列表中的目录名称列表,以与 add_include_dir() 相同的方式。

对失败提出 PreprocessError

以下实用程序方法由 CCompiler 类定义,供各种具体子类使用。

executable_filename(basename[, strip_dir=0, output_dir=''])

返回给定 basename 的可执行文件的文件名。通常对于非Windows平台,这与基本名称相同,而Windows将添加 .exe

library_filename(libname[, lib_type='static', strip_dir=0, output_dir=''])

返回当前平台上给定库名的文件名。在Unix上,具有 'static'lib_type 的库通常将具有 liblibname.a 的形式,而 'dynamic'lib_type 将具有 liblibname.so 的形式。

object_filenames(source_filenames[, strip_dir=0, output_dir=''])

返回给定源文件的目标文件的名称。 source_filenames 应该是一个文件名列表。

shared_object_filename(basename[, strip_dir=0, output_dir=''])

返回给定文件名 basename 的共享对象文件的名称。

execute(func, args[, msg=None, level=1])

调用 distutils.util.execute()。在记录和考虑 dry_run 标志之后,该方法调用具有给定参数 args 的Python函数 func

spawn(cmd)

调用 distutils.util.spawn()。这调用一个外部进程来运行给定的命令。

mkpath(name[, mode=511])

调用 distutils.dir_util.mkpath()。这将创建一个目录和任何缺少的祖先目录。

move_file(src, dst)

调用 distutils.file_util.move_file()。将 src 重命名为 dst

announce(msg[, level=1])

使用 distutils.log.debug() 写消息。

warn(msg)

将一个警告消息 msg 写入标准错误。

debug_print(msg)

如果在此 CCompiler 实例上设置了 debug 标志,则将 msg 打印到标准输出,否则不执行任何操作。

10.3. distutils.unixccompiler — Unix C编译器

此模块提供了 UnixCCompiler 类,它是处理典型的Unix风格的命令行C编译器的 CCompiler 的子类:

  • 宏定义与 -Dname[=value]

  • 宏未定义与 -Uname

  • 包括使用 -Idir 指定的搜索目录

  • -llib 指定的库

  • -Ldir 指定的库搜索目录

  • 编译由 cc (或类似)可执行文件处理与 -c 选项:编译 .c.o

  • 链接静态库由 ar 命令处理(可能与 ranlib

  • 链接共享库由 cc -shared 处理

10.4. distutils.msvccompiler —微软编译器

此模块提供 MSVCCompiler,Microsoft Visual Studio的抽象 CCompiler 类的实现。通常,扩展模块需要使用用于编译Python的相同编译器进行编译。对于Python 2.3和更早版本,编译器是Visual Studio 6.对于Python 2.4和2.5,编译器是Visual Studio .NET 2003. AMD64和Itanium二进制文件是使用Platform SDK创建的。

MSVCCompiler 通常会自行选择正确的编译器,链接器等。要覆盖此选项,必须同时设置环境变量 DISTUTILS_USE_SDKMSSdkMSSdk 表示当前环境已由SDK的 SetEnv.Cmd 脚本设置,或者在安装SDK时已注册环境变量; DISTUTILS_USE_SDK 表示distutils用户已明确选择覆盖 MSVCCompiler 的编译器选择。

10.5. distutils.bcppcompiler — Borland编译器

该模块提供了 BorlandCCompiler,Borland C++编译器的抽象 CCompiler 类的子类。

10.6. distutils.cygwincompiler — Cygwin编译器

这个模块提供了 CygwinCCompiler 类,一个 UnixCCompiler 的子类,用于处理GNU C编译器的Cygwin端口到Windows。它还包含处理GCC的mingw32端口的Mingw32CCompiler类(与no-cygwin模式下的cygwin相同)。

10.7. distutils.archive_util —存档实用程序

此模块提供了一些创建归档文件的功能,例如tarball或zipfiles。

distutils.archive_util.make_archive(base_name, format[, root_dir=None, base_dir=None, verbose=0, dry_run=0])

创建归档文件(例如,ziptar)。 base_name 是要创建的文件的名称,减去任何特定于格式的扩展名; format 是归档格式:ziptargztarbztarxztarztar 之一。 root_dir 是将成为归档的根目录的目录;即。我们通常在创建归档之前将 chdir 转换为 root_dirbase_dir 是我们开始归档的目录;即。 base_dir 将是归档中所有文件和目录的公共前缀。 root_dirbase_dir 都默认为当前目录。返回归档文件的名称。

在 3.5 版更改: 添加了对 xztar 格式的支持。

distutils.archive_util.make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0])

‘从 base_dir 中及其下的所有文件创建一个(可选压缩的)存档作为tar文件。 compress 必须是 'gzip' (默认值),'bzip2''xz''compress'None。对于 'compress' 方法,compress 命名的压缩实用程序必须位于默认程序搜索路径上,因此这可能是特定于Unix的。输出tar文件将被命名为 base_dir.tar,可能加上相应的压缩扩展(.gz.bz2.xz.Z)。返回输出文件名。

在 3.5 版更改: 增加了对 xz 压缩的支持。

distutils.archive_util.make_zipfile(base_name, base_dir[, verbose=0, dry_run=0])

base_dir 中和下的所有文件创建一个zip文件。输出的zip文件将命名为 base_name + .zip。使用 zipfile Python模块(如果可用)或InfoZIP zip 实用程序(如果已安装并在默认搜索路径上找到)。如果两个工具都不可用,则提高 DistutilsExecError。返回输出zip文件的名称。

10.8. distutils.dep_util —依赖性检查

此模块提供用于对文件和文件组执行简单的,基于时间戳的依赖的功能;还有,完全基于这种时间戳依赖性分析的函数。

distutils.dep_util.newer(source, target)

如果 source 存在并且比 target 更近地修改,或者如果 source 存在并且 target 不存在,则返回真。如果两者都存在并且 targetsource 相同或更新,则返回false。如果 source 不存在,则提高 DistutilsFileError

distutils.dep_util.newer_pairwise(sources, targets)

并行地走两个文件名列表,测试每个源是否比其相应的目标更新。返回一对列表(sourcestargets),其中源比目标更新,根据 newer() 的语义。

distutils.dep_util.newer_group(sources, target[, missing='error'])

如果 target 对于 sources 中列出的任何文件都过时,则返回true。换句话说,如果 target 存在并且比 sources 中的每个文件都更新,则返回false;否则返回true。 missing 控制当源文件丢失时我们做什么;默认('error')是从 os.stat() 内部冒出 OSError;如果是 'ignore',我们会静静删除任何缺少的源文件;如果是 'newer',任何缺失的源文件使我们假设 target 已过时(这在“干运行”模式下很方便:它会让你假装执行不能工作的命令,因为输入是缺少,但这并不重要,因为你实际上不打算运行命令)。

10.9. distutils.dir_util —目录树操作

此模块提供对目录和目录树进行操作的功能。

distutils.dir_util.mkpath(name[, mode=0o777, verbose=0, dry_run=0])

创建目录和任何缺少的祖先目录。如果目录已经存在(或者如果 name 是空字符串,这意味着当前目录,当然存在),然后什么都不做。如果无法创建一些目录(例如,一些子路径存在,但是是文件而不是目录),则提高 DistutilsFileError。如果 verbose 为true,则将每个mkdir的单行摘要打印到stdout。返回实际创建的目录的列表。

distutils.dir_util.create_tree(base_dir, files[, mode=0o777, verbose=0, dry_run=0])

创建 base_dir 下的所有空目录,需要把 files 放在那里。 base_dir 只是一个不一定存在的目录的名称; files 是要相对于 base_dir 解释的文件名的列表。 base_dir +将创建 files 中每个文件的目录部分(如果它不存在)。 modeverbosedry_run 标志与 mkpath() 相同。

distutils.dir_util.copy_tree(src, dst[, preserve_mode=1, preserve_times=1, preserve_symlinks=0, update=0, verbose=0, dry_run=0])

将整个目录树 src 复制到新位置 dstsrcdst 都必须是目录名称。如果 src 不是目录,提出 DistutilsFileError。如果 dst 不存在,则使用 mkpath() 创建。复制的最终结果是 src 中的每个文件被复制到 dst,并且 src 下的目录被递归地复制到 dst。使用其输出名称返回已复制或可能已复制的文件的列表。返回值不受 updatedry_run 影响:它只是 src 下所有文件的列表,其名称更改为 dst 下。

preserve_modepreserve_timesdistutils.file_util.copy_file() 相同;注意它们只适用于常规文件,而不适用于目录。如果 preserve_symlinks 为真,符号链接将被复制为符号链接(在支持它们的平台上)。否则(默认),将复制符号链接的目标。 updateverbosecopy_file() 相同。

将跳过以 .nfs 开头的 src 中的文件(有关这些文件的更多信息在 NFS常见问题 的答案D2中可用)。

在 3.3.1 版更改: NFS文件被忽略。

distutils.dir_util.remove_tree(directory[, verbose=0, dry_run=0])

递归地删除 directory 和它下面的所有文件和目录。任何错误都被忽略(除了在 verbose 为真时被报告给 sys.stdout)。

10.10. distutils.file_util —单文件操作

此模块包含一些用于操作单个文件的实用程序功能。

distutils.file_util.copy_file(src, dst[, preserve_mode=1, preserve_times=1, update=0, link=None, verbose=0, dry_run=0])

将文件 src 复制到 dst。如果 dst 是目录,则 src 以相同的名称复制;否则,它必须是一个文件名。 (如果文件存在,它将被无情地破坏。)如果 preserve_mode 为true(默认值),则复制文件的模式(类型和权限位,或当前平台上类似的任何类型)。如果 preserve_times 为true(默认值),则也会复制最后修改和最后访问时间。如果 update 为真,则仅当 dst 不存在,或者 dst 存在但比 src 旧时,才会复制 src

link 允许您使用硬链接(使用 os.link())或符号链接(使用 os.symlink())而不是复制:将其设置为 'hard''sym';如果是 None (默认),则复制文件。不要在不支持 link 的系统上设置 linkcopy_file() 不检查是否有硬链接或符号链接。它使用 _copy_file_contents() 复制文件内容。

返回一个元组 (dest_name, copied)dest_name 是输出文件的实际名称,如果文件被复制,copied 为真(如果 dry_run 为真,则 copied 为真)。

distutils.file_util.move_file(src, dst[, verbose, dry_run])

将文件 src 移动到 dst。如果 dst 是目录,则文件将以相同的名称移动到其中;否则,src 只是重命名为 dst。返回文件的新全名。

警告

使用 copy_file() 处理Unix上的跨设备移动。其他系统呢?

distutils.file_util.write_file(filename, contents)

创建一个名为 filename 的文件,并写入 contents (一个没有行终止符的字符串序列)。

10.11. distutils.util —其他其他效用函数

此模块包含其他任何不适合任何其他实用程序模块的位和段。

distutils.util.get_platform()

返回一个标识当前平台的字符串。这主要用于区分特定于平台的构建目录和特定于平台的构建分布。通常包括操作系统名称和版本以及体系结构(由’os.uname()’提供),尽管包括的确切信息取决于操作系统;例如。对于IRIX架构并不是特别重要(IRIX只能在SGI硬件上运行),但对于Linux来说内核版本并不是特别重要。

返回值示例:

  • linux-i586

  • linux-alpha

  • solaris-2.6-sun4u

  • irix-5.3

  • irix64-6.2

对于非POSIX平台,目前只返回 sys.platform

对于Mac OS X系统,操作系统版本反映运行二进制文件的最小版本(即Python生成期间的 MACOSX_DEPLOYMENT_TARGET 值),而不是当前系统的操作系统版本。

对于Mac OS X上的通用二进制版本,体系结构值反映通用二进制状态,而不是当前处理器的体系结构。对于32位通用二进制,架构是 fat,对于64位通用二进制,架构是 fat64,对于4路通用二进制,架构是 universal。从Python 2.7和Python 3.2开始,架构 fat3 用于3向通用构建(ppc,i386,x86_64),intel 用于通用构建,使用i386和x86_64架构

Mac OS X上返回值的示例:

  • macosx-10.3-ppc

  • macosx-10.3-fat

  • macosx-10.5-universal

  • macosx-10.6-intel

distutils.util.convert_path(pathname)

返回’pathname’作为将在本机文件系统上工作的名称,即,将它拆分为’/’,并使用当前目录分隔符将其重新放在一起。需要,因为安装脚本中的文件名始终以Unix风格提供,并且必须转换为本地约定,然后才能在文件系统中实际使用它们。如果 pathname 以斜杠开头或结尾,则在非Unix-ish系统上提升 ValueError

distutils.util.change_root(new_root, pathname)

返回带有 new_rootpathname 前置。如果 pathname 是相对的,这相当于 os.path.join(new_root,pathname) 否则,它需要使 pathname 相对,然后加入两个,这在DOS/Windows是棘手的。

distutils.util.check_environ()

确保’os.environ’具有我们保证用户可以在配置文件,命令行选项等中使用的所有环境变量。目前包括:

  • HOME - 用户的主目录(仅限Unix)

  • PLAT - 当前平台的描述,包括硬件和操作系统(请参阅 get_platform()

distutils.util.subst_vars(s, local_vars)

s 上执行shell/Perl样式变量替换。每个出现的 $ 后面跟着一个名称被认为是一个变量,变量由 local_vars 字典中的值替代,或者如果它不在 local_vars 中,则替换为 os.environ。首先检查/增强 os.environ 以保证其包含某些值:参见 check_environ()。对于在 local_varsos.environ 中未找到的任何变量,提高 ValueError

注意,这不是一个完全成熟的字符串插值函数。有效的 $variable 只能由大小写字母,数字和下划线组成。无{ }或( )样式引用可用。

distutils.util.split_quoted(s)

根据Unix shell样规则分割引号和反斜杠的字符串。简而言之:单词由空格分隔,只要这些空格不会被反斜杠或引号字符串内部转义。单引号和双引号是等价的,引号字符可以是反斜杠转义。反斜杠从任何双字符转义序列中删除,只留下转义字符。引号字符从任何带引号的字符串中删除。返回单词列表。

distutils.util.execute(func, args[, msg=None, verbose=0, dry_run=0])

执行一些影响外部世界的操作(例如,写入文件系统)。这些操作是特殊的,因为它们由 dry_run 标志禁用。这种方法照顾你的所有官僚作风;所有你需要做的是提供函数调用和一个参数元组(以体现正在执行的“外部动作”)和可选消息打印。

distutils.util.strtobool(val)

将真值的字符串表示形式转换为true(1)或false(0)。

真值是 yyesttrueon1;假值是 nnoffalseoff0。如果 val 是别的,提高 ValueError

distutils.util.byte_compile(py_files[, optimize=0, force=0, prefix=None, base_dir=None, verbose=1, dry_run=0, direct=None])

将一组Python源文件字节编译为 __pycache__ 子目录中的 .pyc 文件(参见 PEP 3147PEP 488)。 py_files 是要编译的文件的列表;任何未以 .py 结尾的文件将被静默跳过。 optimize 必须是以下之一:

  • 0 - 不优化

  • 1 - 正常优化(如 python -O

  • 2 - 额外优化(如 python -OO

如果 force 为true,则无论时间戳如何,都会重新编译所有文件。

在每个 bytecode 文件中编码的源文件名缺省为 py_files 中列出的文件名;您可以用 prefixbasedir 修改这些。 prefix 是将从每个源文件名中删除的字符串,base_dir 是将在前面(在 prefix 被剥离之后)的目录名称。您可以根据需要提供 prefixbase_dir 中的一个或两个(或不提供)。

如果 dry_run 为true,实际上不会影响文件系统。

字节编译可以在这个解释器过程中使用标准 py_compile 模块直接完成,或者通过编写临时脚本并执行它来间接编译。通常,您应该让 byte_compile() 找出使用直接编译或不是(参见源的详细信息)。 direct 标志由间接模式中生成的脚本使用;除非你知道你在做什么,将其设置为 None

在 3.2.3 版更改: __pycache__ 子目录中创建名称中带有 import magic tag.pyc 文件,而不是当前目录中没有标记的文件。

在 3.5 版更改: 根据 PEP 488 创建 .pyc 文件。

distutils.util.rfc822_escape(header)

返回转换为包含在 RFC 822 头中的 header 版本,确保每个换行符后面有8个空格。注意,它不对字符串进行其他修改。

10.12. distutils.dist —分布类

此模块提供 Distribution 类,它表示正在构建/安装/分发的模块分发。

10.13. distutils.extension — Extension类

此模块提供了 Extension 类,用于在安装脚本中描述C/C++扩展模块。

10.14. distutils.debug — Distutils调试模式

此模块提供DEBUG标志。

10.15. distutils.errors — Distutils异常

提供Distutils模块使用的异常。注意,Distutils模块可能引发标准异常;特别是,SystemExit通常针对明显是最终用户错误的错误(例如,坏的命令行参数)引发。

此模块可在 from ... import * 模式下安全使用;它只导出其名称以 Distutils 开头并以 Error 结尾的符号。

10.16. distutils.fancy_getopt —围绕标准getopt模块包装

此模块提供了围绕标准 getopt 模块的包装,提供以下附加功能:

  • 短期和长期期权挂在一起

  • 选项有帮助字符串,因此 fancy_getopt() 可能会创建一个完整的使用摘要

  • 选项设置传入对象的属性

  • 布尔选项可以有“负别名”—例如。如果 --quiet--verbose 的“否定别名”,则命令行上的 --quietverbose 设置为false。

distutils.fancy_getopt.fancy_getopt(options, negative_opt, object, args)

包装函数。 optionsFancyGetopt 的构造函数中描述的 (long_option, short_option, help_string) 3元组的列表。 negative_opt 应该是一个字典映射选项名称到选项名称,键和值都应该在 options 列表中。 object 是将用于存储值的对象(参见 FancyGetopt 类的 getopt() 方法)。 args 是参数列表。如果您通过 None 作为 args 将使用 sys.argv[1:]

distutils.fancy_getopt.wrap_text(text, width)

text 包裹到小于 width 宽。

class distutils.fancy_getopt.FancyGetopt([option_table=None])

option_table是3元组的列表:(long_option, short_option, help_string)

如果一个选项接受一个参数,它的 long_option 应该附加 '='short_option 应该只是一个字符,在任何情况下都不是 ':'。如果 long_option 没有相应的 short_option,则 short_option 应为 None。所有选项元组必须有长选项。

FancyGetopt 类提供以下方法:

FancyGetopt.getopt([args=None, object=None])

解析args中的命令行选项。作为属性存储在 object 上。

如果 argsNone 或未提供,则使用 sys.argv[1:]。如果 objectNone 或未提供,则创建新的 OptionDummy 实例,在那里存储选项值,并返回元组 (args, object)。如果提供 object,则其被适当地修改,getopt() 仅返回 args;在这两种情况下,返回的 args 是传入的 args 列表的修改的副本,其保持不变。

FancyGetopt.get_option_order()

返回由 getopt() 的前一个运行处理的 (option, value) 元组的列表,如果 getopt() 尚未被调用,则引发 RuntimeError

FancyGetopt.generate_help([header=None])

从此 FancyGetopt 对象的选项表中生成帮助文本(字符串列表,每个建议的输出行)。

如果提供,请打印提供的 header 在帮助的顶部。

10.17. distutils.filelist — FileList类

此模块提供了 FileList 类,用于戳文件系统和构建文件列表。

10.18. distutils.log —简单PEP 282型记录

10.19. distutils.spawn —产生一个子过程

此模块提供 spawn() 功能,一个前端,用于在子过程中启动另一个程序的各种平台特定功能。还提供 find_executable() 来搜索给定可执行文件名的路径。

10.20. distutils.sysconfig —系统配置信息

distutils.sysconfig 模块提供对Python的低级配置信息的访问。可用的特定配置变量在很大程度上取决于平台和配置。具体变量取决于正在运行的特定版本的Python的构建过程;变量是在Unix系统上使用Python安装的 Makefile 和配置头中找到的变量。配置头被称为 pyconfig.h for Python版本从2.2开始,和 config.h 为早期版本的Python。

提供了一些附加功能,其对 distutils 包的其他部分执行一些有用的操作。

distutils.sysconfig.PREFIX

os.path.normpath(sys.prefix) 的结果。

distutils.sysconfig.EXEC_PREFIX

os.path.normpath(sys.exec_prefix) 的结果。

distutils.sysconfig.get_config_var(name)

返回单个变量的值。这相当于 get_config_vars().get(name)

distutils.sysconfig.get_config_vars(...)

返回一组变量定义。如果没有参数,则返回将配置变量的名称映射到值的字典。如果提供参数,它们应该是字符串,返回值将是一个给出相关值的序列。如果给定的名称没有对应的值,则将包括该变量的 None

distutils.sysconfig.get_config_h_filename()

返回配置头的完整路径名。对于Unix,这将是由 configure 脚本生成的头;对于其他平台,标头将由Python源代码分发直接提供。该文件是特定于平台的文本文件。

distutils.sysconfig.get_makefile_filename()

返回用于构建Python的 Makefile 的完整路径名。对于Unix,这将是一个由 configure 脚本生成的文件;其他平台的意义将有所不同。该文件是特定于平台的文本文件(如果存在)。此函数仅在POSIX平台上有用。

distutils.sysconfig.get_python_inc([plat_specific[, prefix]])

返回一般或平台相关的C包含文件的目录。如果 plat_specific 为true,则返回与平台相关的include目录;如果为false或省略,则返回与平台无关的目录。如果给定 prefix,则它被用作前缀而不是 PREFIX,或者如果 plat_specific 为真,则用作exec-prefix而不是 EXEC_PREFIX

distutils.sysconfig.get_python_lib([plat_specific[, standard_lib[, prefix]]])

返回通用或平台相关库安装的目录。如果 plat_specific 为true,则返回与平台相关的include目录;如果为false或省略,则返回与平台无关的目录。如果给定 prefix,则它被用作前缀而不是 PREFIX,或者如果 plat_specific 为真,则用作exec-prefix而不是 EXEC_PREFIX。如果 standard_lib 为true,则返回标准库的目录,而不是安装第三方扩展的目录。

以下功能仅适用于 distutils 软件包中。

distutils.sysconfig.customize_compiler(compiler)

执行 distutils.ccompiler.CCompiler 实例的任何平台特定的定制。

此功能仅在此时需要在Unix上,但应该一致地调用以支持前向兼容性。它插入不同Unix风格的信息,并存储在Python的 Makefile 中。此信息包括所选的编译器,编译器和链接器选项以及链接器用于共享对象的扩展。

这个函数甚至更特殊用途,只应该使用Python自己的构建过程。

distutils.sysconfig.set_python_build()

通知 distutils.sysconfig 模块它正在用作Python构建过程的一部分。这会改变文件的很多相对位置,允许它们位于构建区域而不是安装的Python中。

10.21. distutils.text_file —文本文件类

此模块提供了 TextFile 类,它提供了一个接口,用于(可选)处理剥离注释,忽略空白行以及使用反斜线连接行。

class distutils.text_file.TextFile([filename=None, file=None, **options])

这个类提供了一个类似文件的对象,它处理在处理一个具有逐行语法的文本文件时你通常想要做的所有事情:strip注释(只要 # 是你的注释字符),跳过空白行,通过转义换行符(即,行尾的反斜杠)连接相邻行,剥离前导和/或尾随空格。所有这些都是可选的并且是独立可控的。

该类提供了一个 warn() 方法,因此您可以生成报告物理行号的警告消息,即使有问题的逻辑行跨多个物理行。还提供了用于实现逐行预测的 unreadline()

TextFile 实例使用 filenamefile 或两者创建。如果两者都是 None,则提高 RuntimeErrorfilename 应该是一个字符串,file 是一个文件对象(或者提供 readline()close() 方法的东西)。建议您至少提供 filename,以便 TextFile 可以将其包含在警告消息中。如果不提供 fileTextFile 使用 open() 内置函数创建自己的。

这些选项都是布尔值,并影响 readline() 返回的值

选项名称

描述

默认

strip_comments

'#' 到行尾,以及任何空格导致 '#' —除非它被反斜杠转义

真正

lstrip_ws

在返回之前从每行剥离领先的空格

rstrip_ws

在返回前从每行中剥离尾部空格(包括行终止符!)。

真正

skip_blanks

跳过去掉注释和空格后的空的行。 (如果lstrip_ws和rstrip_ws都为false,那么某些行可能只由空格组成:即使 skip_blanks 为真,这些行也不会被跳过)。

真正

join_lines

如果反斜杠是在删除注释和空格之后的行上的最后一个非换行符,则连接以下行到它形成一个逻辑行;如果N个连续行以反斜杠结尾,则N + 1个物理行将被合并以形成一个逻辑行。

collapse_join

从前面加入的行中剥离领先的空格;只有 (join_lines and not lstrip_ws) 才重要

注意,由于 rstrip_ws 可以剥离尾部换行符,readline() 的语义必须与内置文件对象的 readline() 方法的语义不同!特别地,readline() 为文件结束返回 None:如果 rstrip_ws 为真,而 skip_blanks 不为真,则空字符串可能只是空白行(或全空白行)。

open(filename)

打开一个新文件 filename。这将覆盖任何 filefilename 构造函数参数。

close()

关闭当前文件并忘记我们知道的一切(包括文件名和当前行号)。

warn(msg[, line=None])

打印(到stderr)一条警告消息绑定到当前文件中的当前逻辑行。如果文件中的当前逻辑行跨多个物理线路,则警告指的是整个范围,例如 "lines 3-5"。如果提供 line,它将覆盖当前行号;它可以是用于指示物理线的范围的列表或元组,或者用于单个物理线的整数。

readline()

从当前文件读取并返回单个逻辑行(如果以前使用 unreadline() “未读”,则从内部缓冲区读取)。如果 join_lines 选项为真,这可能涉及读取连接到单个字符串中的多个物理行。更新当前行号,因此在 readline() 之后调用 warn() 发出关于刚读取的物理行的警告。在文件结束时返回 None,因为如果 rstrip_ws 为真,而 strip_blanks 不为真,则可能出现空字符串。

readlines()

读取并返回当前文件中剩余的所有逻辑行的列表。这会将当前行号更新为文件的最后一行。

unreadline(line)

line (字符串)推送到将由未来 readline() 调用检查的内部缓冲区。方便的实现一个解析器与一行一次的先行。请注意,使用 unreadline() 读取的行不会随后在使用 readline() 读取时重新清除(删除空格,或任何内容)。如果在调用 readline() 之前对 unreadline() 进行多次调用,则在最近的第一个订单中,行将返回最多。

10.22. distutils.version —版本号类

10.23. distutils.cmd — Distutils命令的抽象基类

该模块提供抽象基类 Command

class distutils.cmd.Command(dist)

抽象基类定义命令类,Distutils的“工蜂”。命令类的一个有用的类比是将它们看作具有称为 options 的局部变量的子程序。选项在 initialize_options() 中声明并在 finalize_options() 中定义(给定它们的最终值),这两个选项都必须由每个命令类定义。两者之间的区别是必要的,因为选项值可能来自外部世界(命令行,配置文件,...),并且任何依赖于其他选项的选项必须在这些外部影响被处理后计算—因此 finalize_options() 。子程序的主体是 run() 方法,它也必须由每个命令类实现,它根据其选项的值执行所有的工作。

类构造函数接受单个参数 distDistribution 实例。

10.24. 创建新的Distutils命令

本节概述了创建新Distutils命令的步骤。

新命令存在于 distutils.command 包中的模块中。在该目录中有一个样例模板,名为 command_template。将此文件复制到与正在实现的新命令名称相同的新模块。此模块应实现与模块(和命令)相同名称的类。因此,例如,为了创建命令 peel_banana (以便用户可以运行 setup.py peel_banana),你可以将 command_template 复制到 distutils/command/peel_banana.py,然后编辑它,以便它实现 distutils.cmd.Command 类的一个子类 peel_banana

Command 的子类必须定义以下方法。

Command.initialize_options()

为此命令支持的所有选项设置默认值。请注意,这些默认值可能被其他命令,安装脚本,配置文件或命令行覆盖。因此,这不是编写选项之间的依赖关系的地方;一般来说,initialize_options() 实现只是一串 self.foo = None 赋值。

Command.finalize_options()

为此命令支持的所有选项设置最终值。这总是被称为尽可能晚,即。在从命令行或其他命令的任何选项分配完成后。因此,这是代码选项依赖性的地方:如果 foo 依赖于 bar,那么只要 foo 仍然具有在 initialize_options() 中分配的相同的值,就可以安全地从 bar 设置 foo

Command.run()

命令的存在理由:执行存在要执行的操作,由在 initialize_options() 中初始化的选项控制,由其他命令定制,设置脚本,命令行和配置文件,并在 finalize_options() 中完成。所有终端输出和文件系统交互应由 run() 完成。

Command.sub_commands

sub_commands 形式化了“家庭”命令的概念,例如。 install 作为父命令,具有子命令 install_libinstall_headers 等。一系列命令的父命令将 sub_commands 定义为类属性;它是一个2元组 (command_name, predicate) 的列表,command_name 是一个字符串,predicate 是一个函数,一个字符串或 Nonepredicate 是父命令的方法,用于确定相应的命令是否适用于当前情况。 (例如,install_headers 仅适用于如果我们有任何C头文件要安装。)如果 predicateNone,该命令始终适用。

sub_commands 通常在类的 end 中定义,因为谓词可以是类的方法,因此它们必须已经被定义。规范示例是 install 命令。

10.25. distutils.command — Individual Distutils命令

10.26. distutils.command.bdist —构建二进制安装程序

10.27. distutils.command.bdist_packager —包装商的抽象基类

10.28. distutils.command.bdist_dumb —构建一个“哑”安装程序

10.29. distutils.command.bdist_msi —构建Microsoft Installer二进制包

class distutils.command.bdist_msi.bdist_msi

构建 Windows Installer (.msi)二进制包。

在大多数情况下,bdist_msi 安装程序是比 bdist_wininst 安装程序更好的选择,因为它为Win64平台提供更好的支持,允许管理员执行非交互式安装,并允许通过组策略进行安装。

10.30. distutils.command.bdist_rpm —以Redhat RPM和SRPM构建二进制分发

10.31. distutils.command.bdist_wininst —构建Windows安装程序

10.32. distutils.command.sdist —构建源分发

10.33. distutils.command.build —构建包的所有文件

10.34. distutils.command.build_clib —在包中构建任何C库

10.35. distutils.command.build_ext —在包中构建任何扩展

10.36. distutils.command.build_py —构建包的.py/.pyc文件

class distutils.command.build_py.build_py
class distutils.command.build_py.build_py_2to3

build_py的替代实现,它还对要安装的每个.py文件运行2to3转换库。要在setup.py文件中针对设计为与Python 2.x和3.x一起运行的分发版使用此功能,请添加:

try:
    from distutils.command.build_py import build_py_2to3 as build_py
except ImportError:
    from distutils.command.build_py import build_py

到你的setup.py和以后:

cmdclass = {'build_py': build_py}

到setup()的调用。

10.37. distutils.command.build_scripts —构建包的脚本

10.38. distutils.command.clean —清理软件包构建区域

此命令删除由 build 及其子命令创建的临时文件,如中间编译的目标文件。使用 --all 选项,将删除完整的构建目录。

构建的扩展模块 到位 不会被清除,因为它们不在构建目录中。

10.39. distutils.command.config —执行程序包配置

10.40. distutils.command.install —安装软件包

10.41. distutils.command.install_data —从包安装数据文件

10.42. distutils.command.install_headers —从包安装C/C++头文件

10.43. distutils.command.install_lib —从包安装库文件

10.44. distutils.command.install_scripts —从包安装脚本文件

10.45. distutils.command.register —使用Python包索引注册模块

register 命令使用Python包索引注册包。这在 PEP 301 中更详细地描述。

10.46. distutils.command.check —检查包的元数据

check 命令对包的元数据执行一些测试。例如,它验证所有需要的元数据作为传递给 setup() 函数的参数提供。