包装 (numpy.distutils

numpy提供了增强的distuils功能,使构建和安装使用Fortran编译库的子包、自动生成代码和扩展模块更加容易。要使用numpy distutils的功能,请使用 setup 命令来自 numpy.distutils.core . 有用的 Configuration 课程也在 numpy.distutils.misc_util 这样可以更容易地构造关键字参数来传递给设置函数(通过传递从类的todict()方法获得的字典)。更多信息可在 numpy distutils-用户指南 .

链接库(如BLAS和LAPACK)以及包含路径和其他此类生成选项的选择和位置可以在 site.cfg 位于NumPy根存储库或 .numpy-site.cfg 主目录中的文件。看到了吗 site.cfg.example 示例文件包含在NumPy存储库或sdist中,用于文档。

模块在 numpy.distutils

ccompiler 

ccompiler_opt 

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

cpuinfo.cpu 

core.Extension \(名称),来源[, ...] )

参数

exec_command 

exec_command

log.set_verbosity (V) [, force] )

system_info.get_info (姓名) [, notfound_action] )

未找到操作:

system_info.get_standard_file (fNeN)

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

类配置

class numpy.distutils.misc_util.Configuration(package_name=None, parent_name=None, top_path=None, package_path=None, **attrs)[源代码]

为给定的包名称构造配置实例。如果 parent_name 不是none,然后将包构造为 parent_name 包裹。如果 top_pathpackage_path 如果没有,则假定它们等于在其中创建此实例的文件的路径。numpy发行版中的setup.py文件是如何使用 Configuration 实例。

todict()[源代码]

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

实例

>>> setup(**config.todict())                           
get_distribution()[源代码]

为self返回distutils分发对象。

get_subpackage(subpackage_name, subpackage_path=None, parent_name=None, caller_level=1)[源代码]

返回子包配置列表。

参数
subpackage_nameSTR或无

用于获取配置的子包的名称。“*'在子包中,名称作为通配符处理。

subpackage_pathSTR

如果没有,则假定路径是本地路径加上子包名称。如果在子包路径中找不到setup.py文件,则使用默认配置。

parent_nameSTR

父名。

add_subpackage(subpackage_name, subpackage_path=None, standalone=False)[源代码]

向当前配置实例添加子包。

这在用于向包中添加子包的setup.py脚本中非常有用。

参数
subpackage_nameSTR

子包的名称

subpackage_pathSTR

如果给定,子包路径(如子包)位于子包路径/子包名称中。如果没有,则假定子包位于本地路径/子包名称中。

standalone布尔
add_data_files(*files)[源代码]

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

参数
files序列

参数可以是

  • 2-序列(<datadir prefix>,<path to data file(s)>)

  • 数据文件的路径,其中python data dir前缀默认为package dir。

笔记

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

通过将2元组作为文件参数传入,可以增强这种基本行为。tuple的第一个元素应该指定相对路径(在包安装目录下),将剩余的文件序列安装到该路径(它与源分发中的文件名无关)。tuple的第二个元素是应该安装的文件序列。此序列中的文件可以是文件名、相对路径或绝对路径。对于绝对路径,文件将安装在顶级包安装目录中(不考虑第一个参数)。文件名和相对路径名将安装在作为元组第一个元素指定的路径名下的包安装目录中。

安装路径规则:

  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->parent/a.txt,parent/b.txt

  5. foo/*.txt`->parent/foo/a.txt,parent/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. (太阳, * .txt)->parent/sun/a.txt,parent/sun/b.txt

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

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

另一个特性是,数据文件的路径实际上可以是一个不带参数并返回数据文件的实际路径的函数。这在构建包时生成数据文件时很有用。

实例

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

>>> 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.4libsite packagesmypackage')或'/usr/lib/python2.4/site-packages/mypackage/mysubpackage'('c:python2.4libsite packagesmypackagemysubpackage')。

add_data_dir(data_path)[源代码]

递归地将数据路径下的文件添加到数据文件列表。

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

参数
data_pathSEQ或STR

参数可以是

  • 2-序列(<datadir suffix>,<path to data directory>)

  • 数据目录路径,其中python data dir后缀默认为package dir。

笔记

安装路径规则:

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)[源代码]

添加配置路径包括目录。

将给定的路径序列添加到包含目录列表的开头。此列表对当前包的所有扩展模块都可见。

add_headers(*files)[源代码]

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

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

参数
filesSTR或SEQ

参数可以是:

  • 2-序列(<includedir suffix>,<path to header file(s)>)

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

add_extension(name, sources, **kw)[源代码]

将扩展添加到配置。

创建扩展实例并将其添加到ext_模块列表中。此方法还接受以下传递给扩展构造函数的可选关键字参数。

参数
nameSTR

扩展名的名称

sourcesSEQ

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

include_dirs :
define_macros :
undef_macros :
library_dirs :
类库:
runtime_library_dirs :
extra_objects :
extra_compile_args :
extra_link_args :
extra_f77_compile_args :
extra_f90_compile_args :
export_symbols :
swig_opts :
取决于:

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

语言:
f2py_options :
module_dirs :
extra_info字典或列表

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

笔记

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

add_library(name, sources, **build_info)[源代码]

将库添加到配置。

参数
nameSTR

扩展名的名称。

sources序列

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

build_info可选的

允许使用以下键:

  • 取决于

  • 宏指令

  • include_dirs

  • extra_compiler_args

  • extra_f77_compile_args

  • extra_f90_compile_args

  • f2py_options

  • 语言

add_scripts(*files)[源代码]

向配置中添加脚本。

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

add_installed_library(name, sources, install_dir, build_info=None)[源代码]

类似于添加库,但已安装指定的库。

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

参数
nameSTR

已安装库的名称。

sources序列

库的源文件列表。见 add_library 有关详细信息。

install_dirSTR

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

build_info可选的

允许使用以下键:

  • 取决于

  • 宏指令

  • include_dirs

  • extra_compiler_args

  • extra_f77_compile_args

  • extra_f90_compile_args

  • f2py_options

  • 语言

返回
没有

笔记

对链接到指定的C库所需的选项进行编码的最佳方法是使用“libname.ini”文件,然后使用 get_info 检索所需选项(请参见 add_npy_pkg_config 更多信息)。

add_npy_pkg_config(template, install_dir, subst_dict=None)[源代码]

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

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

参数
templateSTR

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

install_dirSTR

在何处安装npy pkg配置文件,相对于当前包路径。

subst_dict可选的

如果给定,则表单的任何字符串 @key@ 将替换为 subst_dict[key] 安装时在模板文件中。安装前缀始终通过变量提供 @prefix@ ,因为install前缀不容易从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配置文件。使用默认/生成的文件将链接到主机库(即libnpymath.a)。对于交叉编译,您当然需要在使用宿主Python安装时链接到目标库。

您可以复制numpy/core/lib/npy pkg config目录,向.ini文件添加pkgdir值,并将npyu pkgu configu 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(*paths, **kws)[源代码]

将glob应用于路径,并在需要时预先准备本地路径。

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

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)[源代码]

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

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

笔记

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

make_svn_version_py(delete=True)[源代码]

将数据函数附加到将生成的数据文件列表 __svn_version__. 将文件复制到当前包目录。

生成包 __svn_version__. py文件来自svn版本号,它将在python退出后删除,但在执行sdist等命令时可用。

笔记

如果 __svn_version__. Py以前就存在过,什么都没做。

这用于处理SVN存储库中的源目录。

make_config_py(name='__config__')[源代码]

生成包 __config__. py文件,包含在构建包期间使用的系统信息。

此文件已安装到包安装目录。

get_info(*names)[源代码]

获取资源信息。

返回单个字典中参数列表中所有名称的信息(从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配置文件

要使必要的构建选项对第三方可用,可以使用 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

通常,文件需要在构建期间生成,因为它只需要在构建时知道一些信息(例如前缀)。如果使用 Configuration 方法 add_npy_pkg_config . 假设我们有一个模板文件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文件安装到目录包_dir/lib中,foo.ini文件将从foo.ini.in生成,其中 @version@ 将替换为 subst_dict['version'] . 字典自动添加了一个附加的前缀替换规则,其中包含安装前缀(因为这不容易从setup.py获得)。npy pkg配置文件也可以安装在与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)

可以为查找.ini文件提供其他路径列表 get_info .

转换 .src 文件夹

NumPy distutils支持名为<somefile>.src的源文件的自动转换。这个工具可以用来维护非常相似的代码块,只需要在块之间进行简单的更改。在安装程序的生成阶段,如果遇到名为<somefile>.src的模板文件,则将从模板构造名为<somefile>的新文件,并将其放置在生成目录中以供使用。支持两种形式的模板转换。第一种形式出现在名为<file>的文件中。外部src其中ext是公认的Fortran扩展(f,f90,f95,f77,for,ftn,pyf)。第二种形式适用于所有其他情况。看到了吗 转换 .src 使用模板的文件 .