numpy.distutils
numpy提供了增强的distuils功能,使构建和安装使用Fortran编译库的子包、自动生成代码和扩展模块更加容易。要使用numpy distutils的功能,请使用 setup 命令来自 numpy.distutils.core . 有用的 Configuration 课程也在 numpy.distutils.misc_util 这样可以更容易地构造关键字参数来传递给设置函数(通过传递从类的todict()方法获得的字典)。更多信息可在 numpy distutils-用户指南 .
setup
numpy.distutils.core
Configuration
numpy.distutils.misc_util
链接库(如BLAS和LAPACK)以及包含路径和其他此类生成选项的选择和位置可以在 site.cfg 位于NumPy根存储库或 .numpy-site.cfg 主目录中的文件。看到了吗 site.cfg.example 示例文件包含在NumPy存储库或sdist中,用于文档。
site.cfg
.numpy-site.cfg
site.cfg.example
ccompiler
ccompiler_opt
提供 CCompilerOpt 类,用于处理CPU/硬件优化,从解析命令参数开始,到管理CPU基线和可调度特性之间的关系,还生成所需的C标头,最后使用适当的编译器标志编译源代码。
cpuinfo.cpu
core.Extension \(名称),来源[, ...] )
core.Extension
exec_command
log.set_verbosity (V) [, force] )
log.set_verbosity
system_info.get_info (姓名) [, notfound_action] )
system_info.get_info
未找到操作:
system_info.get_standard_file (fNeN)
system_info.get_standard_file
从1)系统范围目录(此模块的目录位置)2)用户主目录(os.environ)返回名为“fname”的文件列表 [“家”] )3)本地目录
numpy.distutils.misc_util.
为给定的包名称构造配置实例。如果 parent_name 不是none,然后将包构造为 parent_name 包裹。如果 top_path 和 package_path 如果没有,则假定它们等于在其中创建此实例的文件的路径。numpy发行版中的setup.py文件是如何使用 Configuration 实例。
todict
返回与distutils安装函数的关键字参数兼容的字典。
实例
>>> setup(**config.todict())
get_distribution
为self返回distutils分发对象。
get_subpackage
返回子包配置列表。
用于获取配置的子包的名称。“*'在子包中,名称作为通配符处理。
如果没有,则假定路径是本地路径加上子包名称。如果在子包路径中找不到setup.py文件,则使用默认配置。
父名。
add_subpackage
向当前配置实例添加子包。
这在用于向包中添加子包的setup.py脚本中非常有用。
子包的名称
如果给定,子包路径(如子包)位于子包路径/子包名称中。如果没有,则假定子包位于本地路径/子包名称中。
add_data_files
将数据文件添加到配置数据文件。
参数可以是
2-序列(<datadir prefix>,<path to data file(s)>) 数据文件的路径,其中python data dir前缀默认为package dir。
2-序列(<datadir prefix>,<path to data file(s)>)
数据文件的路径,其中python data dir前缀默认为package dir。
笔记
文件序列的每个元素的形式都非常灵活,允许在从包中获取文件的位置以及最终应在系统上安装文件的位置进行多种组合。最基本的用法是将files参数序列的元素作为简单的文件名。这将导致本地路径中的文件安装到self.name包(包路径)的安装路径。文件参数也可以是相对路径,在这种情况下,整个相对路径将安装到包目录中。最后,该文件可以是绝对路径名,在这种情况下,该文件将在绝对路径名处找到,但安装到包路径中。
通过将2元组作为文件参数传入,可以增强这种基本行为。tuple的第一个元素应该指定相对路径(在包安装目录下),将剩余的文件序列安装到该路径(它与源分发中的文件名无关)。tuple的第二个元素是应该安装的文件序列。此序列中的文件可以是文件名、相对路径或绝对路径。对于绝对路径,文件将安装在顶级包安装目录中(不考虑第一个参数)。文件名和相对路径名将安装在作为元组第一个元素指定的路径名下的包安装目录中。
安装路径规则:
file.txt->(,file.txt)->父级/file.txt foo/file.txt->(foo,foo/file.txt)->父级/foo/file.txt /foo/bar/file.txt->(,/foo/bar/file.txt)->父级/file.txt * .txt->parent/a.txt,parent/b.txt foo/*.txt`->parent/foo/a.txt,parent/foo/b.txt */*.txt -> (*, */* .txt)->父级/c/a.txt,父级/d/b.txt (sun,file.txt)->父级/sun/file.txt (sun,bar/file.txt)->父级/sun/file.txt (sun,/foo/bar/file.txt)->父级/sun/file.txt (太阳, * .txt)->parent/sun/a.txt,parent/sun/b.txt (sun,bar/*.txt)->父级/sun/a.txt,父级/sun/b.txt (太阳/) ``, `` /``*.txt)->父级/sun/c/a.txt,父级/d/b.txt
file.txt->(,file.txt)->父级/file.txt
foo/file.txt->(foo,foo/file.txt)->父级/foo/file.txt
/foo/bar/file.txt->(,/foo/bar/file.txt)->父级/file.txt
* .txt->parent/a.txt,parent/b.txt
*
foo/*.txt`->parent/foo/a.txt,parent/foo/b.txt
*/*.txt -> (*, */* .txt)->父级/c/a.txt,父级/d/b.txt
*/*.txt
(sun,file.txt)->父级/sun/file.txt
(sun,bar/file.txt)->父级/sun/file.txt
(sun,/foo/bar/file.txt)->父级/sun/file.txt
(太阳, * .txt)->parent/sun/a.txt,parent/sun/b.txt
(sun,bar/*.txt)->父级/sun/a.txt,父级/sun/b.txt
(太阳/) ``, `` /``*.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
递归地将数据路径下的文件添加到数据文件列表。
递归地将数据路径下的文件添加到要安装(和分发)的数据文件列表中。数据路径可以是相对路径名,也可以是绝对路径名,或者是一个2元组,其中第一个参数显示数据目录应安装到安装目录的位置。
2-序列(<datadir suffix>,<path to data directory>) 数据目录路径,其中python data dir后缀默认为package dir。
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
添加配置路径包括目录。
将给定的路径序列添加到包含目录列表的开头。此列表对当前包的所有扩展模块都可见。
add_headers
将可安装的头添加到配置中。
将给定的文件序列添加到头列表的开头。默认情况下,头文件将安装在<python-include>/<self.name.replace('.','/')>/目录下。如果文件项是元组,则其第一个参数指定相对于<python include>路径的实际安装位置。
参数可以是:
2-序列(<includedir suffix>,<path to header file(s)>) 头文件的路径,其中python includedir后缀将默认为包名。
2-序列(<includedir suffix>,<path to header file(s)>)
头文件的路径,其中python includedir后缀将默认为包名。
add_extension
将扩展添加到配置。
创建扩展实例并将其添加到ext_模块列表中。此方法还接受以下传递给扩展构造函数的可选关键字参数。
扩展名的名称
源列表。源列表可能包含函数(称为源生成器),这些函数必须以扩展实例和生成目录作为输入,并返回源文件或源文件列表或不返回。如果没有返回,则不会生成任何源。如果扩展实例在处理完所有源生成器后没有源,则不会生成扩展模块。
依赖项列表包含扩展模块源所依赖的文件或目录的路径。如果Depends列表中的任何路径比扩展模块新,则将重新构建该模块。
要附加到关键字后的关键字的dict或dict列表。
self.paths(…)方法应用于可能包含路径的所有列表。
add_library
将库添加到配置。
扩展名的名称。
允许使用以下键:
取决于 宏指令 include_dirs extra_compiler_args extra_f77_compile_args extra_f90_compile_args f2py_options 语言
取决于
宏指令
include_dirs
extra_compiler_args
extra_f77_compile_args
extra_f90_compile_args
f2py_options
语言
add_scripts
向配置中添加脚本。
将文件序列添加到脚本列表的开头。脚本将安装在<prefix>/bin/目录下。
add_installed_library
类似于添加库,但已安装指定的库。
大多数C库用于 distutils 只用于构建Python扩展,但通过此方法构建的库将被安装,以便第三方包可以重用它们。
distutils
已安装库的名称。
库的源文件列表。见 add_library 有关详细信息。
相对于当前子包安装库的路径。
参见
add_npy_pkg_config
get_info
对链接到指定的C库所需的选项进行编码的最佳方法是使用“libname.ini”文件,然后使用 get_info 检索所需选项(请参见 add_npy_pkg_config 更多信息)。
从模板生成并安装一个npy pkg配置文件。
从生成的配置文件 template 安装在给定的安装目录中,使用 subst_dict 用于变量替换。
模板的路径,相对于当前包路径。
在何处安装npy pkg配置文件,相对于当前包路径。
如果给定,则表单的任何字符串 @key@ 将替换为 subst_dict[key] 安装时在模板文件中。安装前缀始终通过变量提供 @prefix@ ,因为install前缀不容易从setup.py可靠获取。
@key@
subst_dict[key]
@prefix@
这适用于标准安装和就地生成,即 @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
将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__. py,<packagename>u version.py,version.py,and __svn_version__. 字符串变量版本的py, __version__, 和<packagename>版本,直到找到版本号。
make_svn_version_py
将数据函数附加到将生成的数据文件列表 __svn_version__. 将文件复制到当前包目录。
生成包 __svn_version__. py文件来自svn版本号,它将在python退出后删除,但在执行sdist等命令时可用。
如果 __svn_version__. Py以前就存在过,什么都没做。
这用于处理SVN存储库中的源目录。
make_config_py
生成包 __config__. py文件,包含在构建包期间使用的系统信息。
此文件已安装到包安装目录。
获取资源信息。
返回单个字典中参数列表中所有名称的信息(从System_info.get_info)。
传统的C库(通过 add_library )没有安装,只是在生成过程中使用(它们是静态链接的)。可安装的C库是一个纯C库,它不依赖于python C运行时,它的安装方式可以让第三方软件包使用。要构建和安装C库,只需使用该方法 add_installed_library 而不是 add_library ,它采用相同的参数,除了 install_dir 论点:
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
通常,文件需要在构建期间生成,因为它只需要在构建时知道一些信息(例如前缀)。如果使用 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 功能。
@version@
subst_dict['version']
get_npy_pkg_dir
信息很容易从 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 使用模板的文件 .