包装 (numpy.distutils

警告

numpy.distutils已弃用,并将在 Python >= 3.12 中删除。有关更多详细信息,请参阅numpy.distutils 的状态和迁移建议

警告

请注意,setuptools主要版本经常发布,并且这些版本可能包含破坏的更改numpy.distutils,新版本将不再更新setuptools。因此,建议在构建配置中为适用于setuptools您的构建的最新已知版本设置上限版本。

NumPy 提供了增强的 distutils 功能,可以更轻松地构建和安装子包、自动生成代码以及使用 Fortran 编译库的扩展模块。要使用 NumPy distutils 的功能,请使用setup中的命令 numpy.distutils.coreConfiguration还提供了 一个有用的类numpy.distutils.misc_util,可以更轻松地构造关键字参数以传递给设置函数(通过传递从类的 todict() 方法获得的字典)。更多信息请参阅NumPy distutils 用户指南

BLAS 和 LAPACK 等链接库的选择和位置以及包含路径和其他此类构建选项可以在site.cfg 位于 NumPy 根存储库中的文件或.numpy-site.cfg主目录中的文件中指定。请参阅site.cfg.exampleNumPy 存储库或 sdist 中包含的示例文件以获取文档。

模块#numpy.distutils

ccompiler

ccompiler_opt

提供CCompilerOpt类,用于处理 CPU/硬件优化,从解析命令参数开始,到管理 CPU 基线和可分派功能之间的关系,还生成所需的 C 标头,最后使用适当的编译器编译源代码旗帜。

cpuinfo.cpu

core.Extension(名称、来源[、...])

参数

exec_command

执行命令

log.set_verbosity(v[, 力])

system_info.get_info(名称[, notfound_action])

未找到_操作:

system_info.get_standard_file(名字)

返回名为“fname”的文件列表,来自 1) 系统范围目录(此模块的目录位置) 2) 用户 HOME 目录 (os.environ['HOME']) 3) 本地目录

配置类#

numpy.distutils.misc_util。配置( package_name = None , Parent_name = None , top_path = None , package_path = None , ** attrs ) [来源] #

为给定的包名称构造一个配置实例。如果 parent_name不是None,则将该包构造为parent_name包的子包。如果top_pathpackage_path为 None,则假定它们等于创建此实例的文件的路径。numpy 发行版中的 setup.py 文件是如何使用该Configuration实例的很好示例。

todict ( ) [来源] #

返回与 distutils setup 函数的关键字参数兼容的字典。

例子

>>> setup(**config.todict())                           
get_distribution ( ) [来源] #

返回 self 的 distutils 分发对象。

get_subpackage ( subpackage_name , subpackage_path = None , Parent_name = None , caller_level = 1 ) [来源] #

返回子包配置列表。

参数
subpackage_name str 或 None

获取配置的子包名称。 subpackage_name 中的“*”作为通配符处理。

subpackage_path str

如果 None,则假定路径是本地路径加上 subpackage_name。如果在 subpackage_path 中找不到 setup.py 文件,则使用默认配置。

父名称str

父母名字。

add_subpackage ( subpackage_name , subpackage_path = None , standalone = False ) [来源] #

将子包添加到当前的Configuration实例中。

这在 setup.py 脚本中非常有用,用于将子包添加到包中。

参数
子包名称str

子包名称

subpackage_path str

如果给定,则子包路径如子包位于 subpackage_path / subpackage_name 中。如果为 None,则假定子包位于本地路径 / subpackage_name 中。

独立布尔值
add_data_files ( *文件) [来源] #

将数据文件添加到配置 data_files。

参数
文件顺序

参数可以是

  • 2 序列(<数据目录前缀>,<数据文件路径>)

  • 数据文件的路径,其中 python datadir 前缀默认为包目录。

笔记

文件序列的每个元素的形式非常灵活,允许从包中获取文件的位置以及最终应将它们安装在系统上的位置的多种组合。最基本的用法是将文件参数序列的元素作为简单的文件名。这会导致该文件从本地路径安装到 self.name 包的安装路径(包路径)。文件参数也可以是相对路径,在这种情况下,整个相对路径将安装到包目录中。最后,该文件可以是绝对路径名,在这种情况下,将在绝对路径名中找到该文件,但将其安装到包路径中。

可以通过将 2 元组作为文件参数传递来增强此基本行为。元组的第一个元素应指定剩余文件序列应安装到的相对路径(在包安装目录下)(它与源发行版中的文件名无关)。元组的第二个元素是应安装的文件的序列。此序列中的文件可以是文件名、相对路径或绝对路径。对于绝对路径,文件将安装在顶级包安装目录中(无论第一个参数是什么)。文件名和相对路径名将安装在作为元组第一个元素给出的路径名下的包安装目录中。

安装路径规则:

  1. file.txt -> (., file.txt)-> 父/file.txt

  2. foo/file.txt -> (foo, foo/file.txt) -> 父/foo/file.txt

  3. /foo/bar/file.txt -> (., /foo/bar/file.txt) -> 父/file.txt

  4. *.txt -> 父/a.txt、父/b.txt

  5. foo/ *.txt`` -> 父/foo/a.txt, 父/foo/b.txt

  6. */*.txt-> ( *, */ *.txt) -> 父/c/a.txt, 父/d/b.txt

  7. (sun, file.txt) -> 父/sun/file.txt

  8. (sun, bar/file.txt) -> 父/sun/file.txt

  9. (sun, /foo/bar/file.txt) -> 父/sun/file.txt

  10. (sun, *.txt) -> 父/sun/a.txt, 父/sun/b.txt

  11. (sun, bar/ *.txt) -> 父/sun/a.txt, 父/sun/b.txt

  12. (sun/ *, */.txt *) -> 父/sun/c/a.txt, 父/d/b.txt

另一个功能是数据文件的路径实际上可以是一个不带参数并返回数据文件的实际路径的函数。当构建包时生成数据文件时,这非常有用。

例子

将文件添加到要包含在包中的 data_files 列表中。

>>> self.add_data_files('foo.dat',
...     ('fun', ['gun.dat', 'nun/pun.dat', '/tmp/sun.dat']),
...     'bar/cat.dat',
...     '/full/path/to/can.dat')                   

将把这些数据文件安装到:

<package install directory>/
 foo.dat
 fun/
   gun.dat
   nun/
     pun.dat
 sun.dat
 bar/
   car.dat
 can.dat

其中 <package install directory> 是包(或子包)目录,例如 '/usr/lib/python2.4/site-packages/mypackage' ('C: Python2.4 Lib site-packages mypackage') 或 ' /usr/lib/python2.4/site-packages/mypackage/mysubpackage' ('C: Python2.4 Lib site-packages mypackage mysubpackage')。

add_data_dir ( data_path ) [来源] #

递归地将data_path下的文件添加到data_files列表中。

将 data_path 下的文件递归添加到要安装(和分发)的 data_files 列表中。 data_path 可以是相对路径名、绝对路径名或二元组,其中第一个参数显示数据目录应安装到安装目录中的位置。

参数
data_path seq 或 str

参数可以是

  • 2-序列(<数据目录后缀>,<数据目录路径>)

  • 数据目录的路径,其中 python datadir 后缀默认为包目录。

笔记

安装路径规则:

foo/bar -> (foo/bar, foo/bar) -> parent/foo/bar
(gun, foo/bar) -> parent/gun
foo/* -> (foo/a, foo/a), (foo/b, foo/b) -> parent/foo/a, parent/foo/b
(gun, foo/*) -> (gun, foo/a), (gun, foo/b) -> gun
(gun/*, foo/*) -> parent/gun/a, parent/gun/b
/foo/bar -> (bar, /foo/bar) -> parent/bar
(gun, /foo/bar) -> parent/gun
(fun/*/gun/*, sun/foo/bar) -> parent/fun/foo/gun/bar

例子

例如,假设源目录包含 fun/foo.dat 和 fun/bar/car.dat:

>>> self.add_data_dir('fun')                       
>>> self.add_data_dir(('sun', 'fun'))              
>>> self.add_data_dir(('gun', '/full/path/to/fun'))

将把数据文件安装到以下位置:

<package install directory>/
  fun/
    foo.dat
    bar/
      car.dat
  sun/
    foo.dat
    bar/
      car.dat
  gun/
    foo.dat
    car.dat
add_include_dirs ( * paths ) [来源] #

将路径添加到配置包含目录。

将给定的路径序列添加到 include_dirs 列表的开头。该列表对于当前包的所有扩展模块都是可见的。

add_headers ( *文件) [来源] #

将可安装标头添加到配置中。

将给定的文件序列添加到标头列表的开头。默认情况下,标头将安装在 <python- include>/<self.name.replace('.','/')>/ 目录下。如果文件项是元组,则其第一个参数指定相对于 <python-include> 路径的实际安装位​​置。

参数
文件str 或 seq

参数可以是:

  • 2 序列(<includedir 后缀>,<头文件路径>)

  • 头文件的路径,其中 python includedir 后缀将默认为包名称。

add_extension (名称,来源, ** kw ) [来源] #

将扩展添加到配置中。

创建扩展实例并将其添加到 ext_modules 列表中。此方法还采用以下可选关键字参数,这些参数传递给扩展构造函数。

参数
名称字符串

扩展名

序列

来源列表。源列表可能包含函数(称为源生成器),该函数必须将扩展实例和构建目录作为输入并返回源文件或源文件列表或 None。如果没有返回,则不会生成任何源。如果扩展实例在处理所有源生成器后没有源,则不会构建扩展模块。

包含目录
定义宏
undef_宏
库目录
图书馆
运行时库目录
额外对象
额外编译参数
额外链接参数
extra_f77_compile_args
extra_f90_compile_args
导出符号
swig_opts
依靠

依赖列表包含扩展模块的源所依赖的文件或目录的路径。如果依赖列表中的任何路径比扩展模块新,则该模块将被重建。

语言
f2py_选项
模块目录
extra_info字典或列表

字典或要附加到关键字的关键字字典列表。

笔记

self.paths(…) 方法适用于所有可能包含路径的列表。

add_library (名称,来源, ** build_info ) [来源] #

将库添加到配置中。

参数
名称字符串

扩展名。

序列

来源列表。源列表可能包含函数(称为源生成器),该函数必须将扩展实例和构建目录作为输入并返回源文件或源文件列表或 None。如果没有返回,则不会生成任何源。如果扩展实例在处理所有源生成器后没有源,则不会构建扩展模块。

build_info字典,可选

允许使用以下键:

  • 依靠

  • 包含目录

  • 额外编译器参数

  • extra_f77_compile_args

  • extra_f90_compile_args

  • f2py_选项

  • 语言

add_scripts ( *文件) [来源] #

将脚本添加到配置中。

将文件序列添加到脚本列表的开头。脚本将安装在 <prefix>/bin/ 目录下。

add_installed_library (名称,来源, install_dir , build_info = None ) [来源] #

与add_library类似,但是安装指定的库。

大多数使用 with 的 C 库distutils仅用于构建 python 扩展,但通过此方法构建的库将被安装,以便第三方包可以重用它们。

参数
名称字符串

已安装库的名称。

序列

库的源文件列表。add_library详情请参阅。

install_dir字符串

相对于当前子包的安装库的路径。

build_info字典,可选

允许使用以下键:

  • 依靠

  • 包含目录

  • 额外编译器参数

  • extra_f77_compile_args

  • extra_f90_compile_args

  • f2py_选项

  • 语言

返回
没有任何

笔记

对链接指定 C 库所需的选项进行编码的最佳方法是使用“libname.ini”文件,并使用get_info来检索所需的选项(请参阅 参考资料add_npy_pkg_config获取更多信息)。

add_npy_pkg_config ( template , install_dir , subst_dict = None ) [来源] #

从模板生成并安装 npy-pkg 配置文件。

从模板生成的配置文件安装在给定的安装目录中,使用subst_dict进行变量替换。

参数
模板字符串

模板的路径,相对于当前包路径。

install_dir字符串

npy-pkg 配置文件的安装位置,相对于当前包路径。

subst_dict字典,可选

如果给定,则安装时模板文件中的任何形式的字符串都@key@将被替换 。subst_dict[key]安装前缀始终可以通过变量获得@prefix@,因为安装前缀不容​​易从 setup.py 可靠地获取。

笔记

这适用于标准安装和就地构建,即 @prefix@引用就地构建的源目录。

例子

config.add_npy_pkg_config('foo.ini.in', 'lib', {'foo': bar})

假设 foo.ini.in 文件有以下内容:

[meta]
Name=@foo@
Version=1.0
Description=dummy description

[default]
Cflags=-I@prefix@/include
Libs=

生成的文件将包含以下内容:

[meta]
Name=bar
Version=1.0
Description=dummy description

[default]
Cflags=-Iprefix_dir/include
Libs=

并将作为 foo.ini 安装在“lib”子路径中。

使用 numpy distutils 交叉编译时,可能需要使用修改后的 npy-pkg-config 文件。使用默认/生成的文件将链接到主机库(即 libnpymath.a)。对于交叉编译,您当然需要在使用主机 Python 安装时链接目标库。

您可以复制 numpy/core/lib/npy-pkg-config 目录,将 pkgdir 值添加到 .ini 文件中,并将 NPY_PKG_CONFIG_PATH 环境变量设置为指向包含修改后的 npy-pkg-config 文件的目录。

为交叉编译修改的 npymath.ini 示例:

[meta]
Name=npymath
Description=Portable, core math library implementing C99 standard
Version=0.1

[variables]
pkgname=numpy.core
pkgdir=/build/arm-linux-gnueabi/sysroot/usr/lib/python3.7/site-packages/numpy/core
prefix=${pkgdir}
libdir=${prefix}/lib
includedir=${prefix}/include

[default]
Libs=-L${libdir} -lnpymath
Cflags=-I${includedir}
Requires=mlib

[msvc]
Libs=/LIBPATH:${libdir} npymath.lib
Cflags=/INCLUDE:${includedir}
Requires=mlib
路径( * paths , ** kws ) [来源] #

将 glob 应用于路径并在需要时添加 local_path。

将 glob.glob(…) 应用于序列中的每个路径(如果需要)并在需要时预先添加 local_path。因为这在所有源列表上调用,所以允许在扩展模块、库和脚本的源列表中指定通配符,并允许路径名相对于源目录。

get_config_cmd ( ) [来源] #

返回 numpy.distutils 配置命令实例。

get_build_temp_dir ( ) [来源] #

返回应放置临时文件的临时目录的路径。

have_f77c ( ) [来源] #

检查 Fortran 77 编译器的可用性。

在源生成函数中使用它来确保安装分发实例已初始化。

笔记

如果 Fortran 77 编译器可用,则为 True(因为可以成功编译简单的 Fortran 77 代码)。

have_f90c ( ) [来源] #

检查 Fortran 90 编译器的可用性。

在源生成函数中使用它来确保安装分发实例已初始化。

笔记

如果 Fortran 90 编译器可用则为 True(因为简单的 Fortran 90 代码能够成功编译)

get_version ( version_file = None , version_variable = None ) [来源] #

尝试获取包的版本字符串。

返回当前包的版本字符串,如果无法检测到版本信息,则返回 None。

笔记

此方法扫描名为 __version__.py、<packagename>_version.py、version.py 和 __svn_version__.py 的文件中的字符串变量 version、__version__ 和 <packagename>_version,直到找到版本号。

make_svn_version_py ( delete = True ) [来源] #

将数据函数追加到 data_files 列表中,该列表将在当前包目录中生成 __svn_version__.py 文件。

从 SVN 修订号生成包 __svn_version__.py 文件,该文件将在 python 退出后被删除,但在执行 sdist 等命令时可用。

笔记

如果 __svn_version__.py 之前存在,则不执行任何操作。

这是为了处理 SVN 存储库中的源目录。

make_config_py ( name = '__config__' ) [来源] #

生成包 __config__.py 文件,其中包含构建包期间使用的 system_info 信息。

该文件安装到软件包安装目录中。

get_info ( *名称) [来源] #

获取资源信息。

返回单个字典中参数列表中所有名称的信息(来自 system_info.get_info)。

构建可安装的 C 库#

传统的 C 库(通过add_library安装)未安装,仅在构建过程中使用(它们是静态链接的)。可安装的 C 库是纯 C 库,不依赖于 python C 运行时,安装后可供第三方包使用。要构建和安装 C 库,只需使用方法add_installed_library而不是 add_library,它采用相同的参数,除了一个附加 install_dir参数:

.. hidden in a comment so as to be included in refguide but not rendered documentation
  >>> import numpy.distutils.misc_util
  >>> config = np.distutils.misc_util.Configuration(None, '', '.')
  >>> with open('foo.c', 'w') as f: pass

>>> config.add_installed_library('foo', sources=['foo.c'], install_dir='lib')

npy-pkg-config 文件#

为了使必要的构建选项可供第三方使用,您可以使用numpy.distutils.该机制基于包含所有选项的 .ini 文件。 .ini 文件与 pkg-config unix 实用程序使用的 .pc 文件非常相似:

[meta]
Name: foo
Version: 1.0
Description: foo library

[variables]
prefix = /home/user/local
libdir = ${prefix}/lib
includedir = ${prefix}/include

[default]
cflags = -I${includedir}
libs = -L${libdir} -lfoo

通常,该文件需要在构建期间生成,因为它只需要一些在构建时已知的信息(例如前缀)。如果使用add_npy_pkg_configConfiguration方法,这基本上是自动的。假设我们有一个模板文件 foo.ini.in 如下:

[meta]
Name: foo
Version: @version@
Description: foo library

[variables]
prefix = @prefix@
libdir = ${prefix}/lib
includedir = ${prefix}/include

[default]
cflags = -I${includedir}
libs = -L${libdir} -lfoo

以及 setup.py 中的以下代码:

>>> config.add_installed_library('foo', sources=['foo.c'], install_dir='lib')
>>> subst = {'version': '1.0'}
>>> config.add_npy_pkg_config('foo.ini.in', 'lib', subst_dict=subst)

这会将文件 foo.ini 安装到目录 package_dir/lib 中,并且将从 foo.ini.in 生成 foo.ini 文件,其中每个文件@version@都将替换为subst_dict['version'].该字典自动添加了一个额外的前缀替换规则,其中包含安装前缀(因为这不容易从 setup.py 中获取)。 npy-pkg-config 文件也可以使用函数返回的路径安装在与 numpy 相同的位置 get_npy_pkg_dir

重用另一个包中的 C 库#

get_info可以从以下函数 轻松检索信息numpy.distutils.misc_util

>>> info = np.distutils.misc_util.get_info('npymath')
>>> config.add_extension('foo', sources=['foo.c'], extra_info=info)
<numpy.distutils.extension.Extension('foo') at 0x...>

可以向 提供用于查找 .ini 文件的附加路径列表get_info

.src文件转换#

NumPy distutils 支持自动转换名为 <somefile>.src 的源文件。此功能可用于维护非常相似的代码块,只需要在块之间进行简单的更改。在安装程序的构建阶段,如果遇到名为 <somefile>.src 的模板文件,则会从该模板构造一个名为 <somefile> 的新文件,并将其放置在要使用的构建目录中。支持两种形式的模板转换。第一种形式出现在名为 <file>.ext.src 的文件中,其中 ext 是可识别的 Fortran 扩展名(f、f90、f95、f77、for、ftn、pyf)。第二种形式用于所有其他情况。请参阅使用模板转换 .src 文件