NumPy 1.26 中文文档(四十五)

2024-06-28 16:23:48 浏览数 (2)

原文:numpy.org/doc/

numpy.distutils.misc_util

原文:numpy.org/doc/1.26/reference/distutils/misc_util.html

代码语言:javascript复制
numpy.distutils.misc_util.all_strings(lst)

如果 lst 中的所有项都是字符串对象,则返回 True。

代码语言:javascript复制
numpy.distutils.misc_util.allpath(name)

将一个 / 分隔的路径名转换为使用 OS 路径分隔符的路径。

代码语言:javascript复制
numpy.distutils.misc_util.appendpath(prefix, path)
代码语言:javascript复制
numpy.distutils.misc_util.as_list(seq)
代码语言:javascript复制
numpy.distutils.misc_util.blue_text(s)
代码语言:javascript复制
numpy.distutils.misc_util.cyan_text(s)
代码语言:javascript复制
numpy.distutils.misc_util.cyg2win32(path: str) → str

将路径从 Cygwin 本地转换为 Windows 本地。

使用 cygpath 实用程序(Base 安装的一部分)进行实际转换。如果失败,则回退返回原始路径。

处理默认的 /cygdrive 挂载前缀以及 /proc/cygdrive 便携前缀,自定义的 cygdrive 前缀如 //mnt,以及绝对路径如 /usr/src//home/username

参数:

pathstr

要转换的路径

返回:

converted_pathstr

转换后的路径

笔记

cygpath 实用程序文档:cygwin.com/cygwin-ug-net/cygpath.html 它包装的 C 函数文档:cygwin.com/cygwin-api/func-cygwin-conv-path.html

代码语言:javascript复制
numpy.distutils.misc_util.default_config_dict(name=None, parent_name=None, local_path=None)

返回一个配置字典,用于配置文件 setup_.py 中定义的 configuration() 函数的使用。

代码语言:javascript复制
numpy.distutils.misc_util.dict_append(d, **kws)
代码语言:javascript复制
numpy.distutils.misc_util.dot_join(*args)
代码语言:javascript复制
numpy.distutils.misc_util.exec_mod_from_location(modname, modfile)

使用 importlib 机制从文件 modfile 导入模块 modname。根据 spec.loader,模块可能未在 sys.modules 中注册。

代码语言:javascript复制
numpy.distutils.misc_util.filter_sources(sources)

返回包含 C、C 、Fortran 和 Fortran 90 模块源文件名称的四个列表。

代码语言:javascript复制
numpy.distutils.misc_util.generate_config_py(target)

生成包含在构建软件包过程中使用的 system_info 信息的 config.py 文件。

用法:

config[‘py_modules’].append((packagename, ‘config’,generate_config_py))

代码语言:javascript复制
numpy.distutils.misc_util.get_build_architecture()
代码语言:javascript复制
numpy.distutils.misc_util.get_cmd(cmdname, _cache={})
代码语言:javascript复制
numpy.distutils.misc_util.get_data_files(data)
代码语言:javascript复制
numpy.distutils.misc_util.get_dependencies(sources)
代码语言:javascript复制
numpy.distutils.misc_util.get_ext_source_files(ext)
代码语言:javascript复制
numpy.distutils.misc_util.get_frame(level=0)

从调用堆栈中返回给定级别的帧对象。

代码语言:javascript复制
numpy.distutils.misc_util.get_info(pkgname, dirs=None)

为给定 C 库返回一个 info 字典。

info 字典包含了使用 C 库所需的选项。

参数:

pkgnamestr

包的名称(应与 .ini 文件的名称匹配,不带扩展名,例如,文件 foo.ini 对应的名称为 foo)。

dirssequence, optional

如果给定,应为额外目录序列,用于查找 npy-pkg-config 文件。在 NumPy 目录之前搜索这些目录。

返回:

infodict

具有构建信息的字典。

引发:

PkgNotFound

如果找不到包。

另请参阅

Configuration.add_npy_pkg_configConfiguration.add_installed_library

get_pkg_info

示例

从 NumPy 获取 npymath 库所需的信息:

代码语言:javascript复制
>>> npymath_info = np.distutils.misc_util.get_info('npymath')
>>> npymath_info                                    
{'define_macros': [], 'libraries': ['npymath'], 'library_dirs':
['.../numpy/core/lib'], 'include_dirs': ['.../numpy/core/include']} 

然后,此 info 字典可以作为 Configuration 实例的输入:

代码语言:javascript复制
config.add_extension('foo', sources=['foo.c'], extra_info=npymath_info) 
代码语言:javascript复制
numpy.distutils.misc_util.get_language(sources)

从源代码确定语言值(c,f77,f90)

代码语言:javascript复制
numpy.distutils.misc_util.get_lib_source_files(lib)
代码语言:javascript复制
numpy.distutils.misc_util.get_mathlibs(path=None)

返回 numpyconfig.h 中的 MATHLIB 行

代码语言:javascript复制
numpy.distutils.misc_util.get_num_build_jobs()

获取由 setup.py 的–parallel 命令行参数设置的并行构建作业的数量。如果命令没有接收设置,则检查环境变量 NPY_NUM_BUILD_JOBS。如果未设置,则返回系统上的处理器数量,最多为 8 个(以防止系统超载,如果有大量 CPU)。

返回:

outint

可以运行的并行作业数量

代码语言:javascript复制
numpy.distutils.misc_util.get_numpy_include_dirs()
代码语言:javascript复制
numpy.distutils.misc_util.get_pkg_info(pkgname, dirs=None)

返回给定包的库信息。

参数:

pkgnamestr

包的名称(应与.ini 文件的名称匹配,不包括扩展名,例如对于文件 foo,包名应为 foo)。

dirs序列,可选

如果给出,应该是一个额外的目录序列,在这些目录中查找 npy-pkg-config 文件。在 NumPy 目录之前搜索这些目录。

返回:

pkginfo类实例

包含构建信息的LibraryInfo实例。

引发:

PkgNotFound

如果找不到包。

参见

Configuration.add_npy_pkg_configConfiguration.add_installed_library

get_info

代码语言:javascript复制
numpy.distutils.misc_util.get_script_files(scripts)
代码语言:javascript复制
numpy.distutils.misc_util.gpaths(paths, local_path='', include_non_existing=True)

对路径应用 glob,并在需要时添加 local_path。

代码语言:javascript复制
numpy.distutils.misc_util.green_text(s)
代码语言:javascript复制
numpy.distutils.misc_util.has_cxx_sources(sources)

如果 sources 包含 C 文件,则返回 True

代码语言:javascript复制
numpy.distutils.misc_util.has_f_sources(sources)

如果 sources 包含 Fortran 文件,则返回 True

代码语言:javascript复制
numpy.distutils.misc_util.is_local_src_dir(directory)

如果目录是本地目录,则返回 True。

代码语言:javascript复制
numpy.distutils.misc_util.is_sequence(seq)
代码语言:javascript复制
numpy.distutils.misc_util.is_string(s)
代码语言:javascript复制
numpy.distutils.misc_util.mingw32()

在使用 mingw32 环境时返回 True。

代码语言:javascript复制
numpy.distutils.misc_util.minrelpath(path)

从路径中解析 *.

代码语言:javascript复制
numpy.distutils.misc_util.njoin(*path)

连接两个或更多的路径名组件 - 将一个以/分隔的路径名转换为使用 OS 的路径分隔符。- 从路径中解析 *和 *。

可以通过传递 n 个参数(例如 njoin(‘a’,‘b’)),或传递 n 个名称的序列(例如 njoin([‘a’,‘b’])),或这些参数的混合来处理。

代码语言:javascript复制
numpy.distutils.misc_util.red_text(s)
代码语言:javascript复制
numpy.distutils.misc_util.sanitize_cxx_flags(cxxflags)

一些标志对 C 有效但对 C 无效。将它们剪切。

代码语言:javascript复制
numpy.distutils.misc_util.terminal_has_colors()
代码语言:javascript复制
numpy.distutils.misc_util.yellow_text(s)

numpy.distutils.ccompiler

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.ccompiler.html

函数

CCompiler_compile(self, sources[, …])

编译一个或多个源文件。

CCompiler_customize(self, dist[, need_cxx])

对编译器实例进行任何特定于平台的定制。

CCompiler_customize_cmd(self, cmd[, ignore])

使用 distutils 命令自定义编译器。

CCompiler_cxx_compiler(self)

返回 C 编译器。

CCompiler_find_executables(self)

此处无操作,但由 get_version 方法调用,可以被子类重写。

CCompiler_get_version(self[, force, ok_status])

返回编译器版本,如果编译器不可用,则返回 None。

CCompiler_object_filenames(self, …[, …])

返回给定源文件的对象文件的名称。

CCompiler_show_customization(self)

将编译器的定制打印到标准输出。

CCompiler_spawn(self, cmd[, display, env])

在子进程中执行命令。

gen_lib_options(compiler, library_dirs, …)

new_compiler([plat, compiler, verbose, …])

replace_method(klass, method_name, func)

simple_version_match([pat, ignore, start])

版本号简单匹配,用于 CCompiler 和 FCompiler。

numpy.distutils.ccompiler_opt

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.ccompiler_opt.html

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

CCompilerOpt 不提供对 CPU 特性的运行时检测,而是仅关注编译器方面,但它创建了可以在最终运行时调度过程中后续使用的抽象 C 头文件。

函数

new_ccompiler_opt(compiler, dispatch_hpath, …)

创建一个新的 ‘CCompilerOpt’ 实例,并生成包含启用的 CPU 基线和可调度特性的平台特定指令集的 #定义和头文件的调度头文件。

CCompilerOpt(ccompiler[, cpu_baseline, …])

一个辅助类用于CCompiler,旨在提供额外的构建选项,以有效地控制与 CPU 特性直接相关的编译器优化。

numpy.distutils.cpuinfo.cpu

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.cpuinfo.cpu.html

代码语言:javascript复制
distutils.cpuinfo.cpu = <numpy.distutils.cpuinfo.LinuxCPUInfo object>

numpy.distutils.core.Extension

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.core.Extension.html

代码语言:javascript复制
class numpy.distutils.core.Extension(name, sources, include_dirs=None, define_macros=None, undef_macros=None, library_dirs=None, libraries=None, runtime_library_dirs=None, extra_objects=None, extra_compile_args=None, extra_link_args=None, export_symbols=None, swig_opts=None, depends=None, language=None, f2py_options=None, module_dirs=None, extra_c_compile_args=None, extra_cxx_compile_args=None, extra_f77_compile_args=None, extra_f90_compile_args=None)

参数:

namestr

扩展名。

sourcesstr 列表

源文件相对于包顶级目录的位置列表。

extra_compile_argsstr 列表

传递给编译器的额外命令行参数。

extra_f77_compile_argsstr 列表

传递给 fortran77 编译器的额外命令行参数。

extra_f90_compile_argsstr 列表

传递给 fortran90 编译器的额外命令行参数。

方法

has_cxx_sources

has_f2py_sources

numpy.distutils.exec_command

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.exec_command.html

exec_command

实现了几乎等同于 commands.getstatusoutput 函数的 exec_command 函数,但在 NT、DOS 系统上返回的状态实际上是正确的(虽然返回的状态值可能会有所不同)。此外,exec_command 采用关键字参数来(重新)定义环境变量。

提供函数:

exec_command — 在指定目录中执行命令 在修改后的环境中。 find_executable — 利用环境信息找到一个命令 变量 PATH。相当于 posix 的which命令。

作者:Pearu Peterson pearu@cens.ioc.ee 创建日期:2003 年 1 月 11 日

需要:Python 2.x

成功测试:

os.name

sys.platform

comments

posix

linux2

Debian (sid) Linux, Python 2.1.3 , 2.2.3 , 2.3.3 PyCrust 0.9.3, Idle 1.0.2

posix

linux2

Red Hat 9 Linux, Python 2.1.3, 2.2.2, 2.3.2

posix

sunos5

SunOS 5.9, Python 2.2, 2.3.2

posix

darwin

Darwin 7.2.0, Python 2.3

nt

win32

Windows Me Python 2.3(EE), Idle 1.0, PyCrust 0.7.2 Python 2.1.1 Idle 0.8

nt

win32

Windows 98, Python 2.1.1. Idle 0.8

nt

win32

Cygwin 98-4.10, Python 2.1.1(MSC) - echo 测试失败,即重新定义环境变量可能无效。已修复:不使用 cygwin echo!评论:cmd /c echo也不能工作,但重新定义环境变量可以工作。

posix

cygwin

Cygwin 98-4.10, Python 2.3.3(cygming special)

nt

win32

Windows XP, Python 2.3.3

已知的错误:

  • 从 MSYS 提示符中执行时,向 stderr 发送消息的测试失败,因为在某个时候消息会丢失。

函数

exec_command(command[, execute_in, …])

返回执行命令的状态和输出。

filepath_from_subprocess_output(output)

将子进程使用编码的bytes转换为适合文件系统的str。

find_executable(exe[, path, _cache])

返回可执行文件的完整路径,如果不存在则返回 None。

forward_bytes_to_stdout(val)

将子进程调用的字节直接转发到控制台,而不尝试解码它们。

get_pythonexe()

temp_file_name()

numpy.distutils.log.set_verbosity

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.log.set_verbosity.html

代码语言:javascript复制
distutils.log.set_verbosity(v, force=False)

numpy.distutils.system_info.get_info

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.system_info.get_info.html

代码语言:javascript复制
distutils.system_info.get_info(name, notfound_action=0)

notfound_action:

0 - 什么也不做 1 - 显示警告消息 2 - 引发错误

numpy.distutils.system_info.get_standard_file

原文:numpy.org/doc/1.26/reference/generated/numpy.distutils.system_info.get_standard_file.html

代码语言:javascript复制
distutils.system_info.get_standard_file(fname)

返回一个名为’fname’的文件列表,来自于:1)系统范围的目录(本模块的目录位置)2)用户的 HOME 目录(os.environ[‘HOME’])3)本地目录

NumPy distutils - 用户指南

原文:numpy.org/doc/1.26/reference/distutils_guide.html

警告

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

SciPy 结构

目前 SciPy 项目包含两个包:

  • NumPy — 它提供如下包:
    • numpy.distutils - Python distutils 的扩展
    • numpy.f2py - 将 Fortran/C 代码绑定到 Python 的工具
    • numpy.core - 用于替代 Numeric 和 numarray 包的未来版本
    • numpy.lib - 额外实用函数
    • numpy.testing - 用于单元测试的 numpy 风格工具
    • 等等
  • SciPy — 一套用于 Python 的科学工具集。

本文档的目的是描述如何向 SciPy 中添加新工具。

SciPy 包的要求

SciPy 由名为 SciPy 包的 Python 包组成,通过 scipy 命名空间可以提供给 Python 用户使用。每个 SciPy 包可能包含其他 SciPy 包。因此,SciPy 目录树是具有任意深度和宽度的包树。任何 SciPy 包可能依赖于 NumPy 包,但对其他 SciPy 包的依赖应尽可能减少或为零。

一个 SciPy 包除了其源代码外,还包括以下文件和目录:

  • setup.py — 构建脚本
  • __init__.py — 包初始化器
  • tests/ — 单元测试目录

它们的内容如下所述。

setup.py 文件

为了将一个 Python 包添加到 SciPy,其构建脚本 (setup.py) 必须符合某些要求。最重要的要求是包定义一个 configuration(parent_package='',top_path=None) 函数,该函数返回一个适合传递给 numpy.distutils.core.setup(..) 的字典。为了简化构造此字典,numpy.distutils.misc_util 提供了下面描述的 Configuration 类。

SciPy 纯 Python 包示例

下面是一个纯 SciPy 包的最小 setup.py 文件示例:

代码语言:javascript复制
#!/usr/bin/env python3
def configuration(parent_package='',top_path=None):
    from numpy.distutils.misc_util import Configuration
    config = Configuration('mypackage',parent_package,top_path)
    return config

if __name__ == "__main__":
    from numpy.distutils.core import setup
    #setup(**configuration(top_path='').todict())
    setup(configuration=configuration) 

configuration 函数的参数指定了父 SciPy 包的名称(parent_package)和主 setup.py 脚本的目录位置(top_path)。这些参数和当前包的名称应该传递给 Configuration 构造函数。

Configuration 构造函数有第四个可选参数,package_path,当包文件位于与 setup.py 文件所在目录不同的位置时可以使用。

剩余的Configuration参数都是初始化Configuration实例属性时将使用的关键字参数。通常,这些关键字与setup(..)函数所期望的关键字相同,例如,packages, ext_modules, data_files, include_dirs, libraries, headers, scripts, package_dir等。但是,不建议直接指定这些关键字参数,因为这些关键字参数的内容不会被处理或检查 SciPy 构建系统的一致性。

最后,Configuration具有.todict()方法,它将所有配置数据作为适合传递给setup(..)函数的字典返回。

Configuration实例属性

除了可以通过关键字参数指定给Configuration构造函数的属性之外,Configuration实例(我们以config表示)还具有以下属性,这些属性在编写设置脚本时可能会有用:

  • config.name - 当前软件包的完整名称。可以提取父软件包的名称作为config.name.split('.')
  • config.local_path - 指向当前setup.py文件的路径。
  • config.top_path - 指向主setup.py文件的路径。
Configuration实例方法

config.todict() — 返回适合传递给numpy.distutils.core.setup(..)函数的配置字典。

config.paths(*paths) --- 如有必要,将paths的项应用于``glob.glob(..)。修复相对于config.local_pathpaths项。

config.get_subpackage(subpackage_name,subpackage_path=None) — 返回子软件包配置的列表。在当前目录中查找名称为subpackage_name的子软件包,但也可以通过可选的subpackage_path参数指定路径。如果将subpackage_name指定为None,则子软件包的名称将采用subpackage_path的基本名称。任何用于子软件包名称的*都会按通配符进行展开。

config.add_subpackage(subpackage_name,subpackage_path=None) — 将 SciPy 子软件包配置添加到当前配置中。上面解释了参数的含义和用法,请参见config.get_subpackage()方法。

config.add_data_files(*files) — 将files添加到data_files列表的开头。如果files项是元组,则其第一个元素定义了数据文件相对于软件包安装目录的后缀,第二个元素指定了数据文件的路径。默认情况下,数据文件被复制到软件包安装目录下。例如,

代码语言:javascript复制
config.add_data_files('foo.dat',
                      ('fun',['gun.dat','nun/pun.dat','/tmp/sun.dat']),
                      'bar/car.dat'.
                      '/full/path/to/can.dat',
                      ) 

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

代码语言:javascript复制
<installation path of config.name package>/
  foo.dat
  fun/
    gun.dat
    pun.dat
    sun.dat
  bar/
    car.dat
  can.dat 

数据文件的路径可以是一个不带参数并返回数据文件路径的函数 —— 当在构建软件包时生成数据文件时,这是非常有用的。(XXX:解释确切调用这些函数的步骤)

config.add_data_dir(data_path) — 递归地将data_path目录添加到data_files中。从data_path开始的整个目录树将被复制到包安装目录下。如果data_path是一个元组,则它的第一个元素定义了数据文件被复制的后缀,相对于包安装目录,第二个元素指定了数据目录的路径。默认情况下,数据目录将被复制到包安装目录下的data_path的基本名称下。例如,

代码语言:javascript复制
config.add_data_dir('fun')  # fun/ contains foo.dat bar/car.dat
config.add_data_dir(('sun','fun'))
config.add_data_dir(('gun','/full/path/to/fun')) 

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

代码语言:javascript复制
<installation path of config.name package>/
  fun/
     foo.dat
     bar/
        car.dat
  sun/
     foo.dat
     bar/
        car.dat
  gun/
     foo.dat
     bar/
        car.dat 

config.add_include_dirs(*paths) — 将paths添加到include_dirs列表的开头。这个列表对当前包的所有扩展模块可见。

config.add_headers(*files) — 将files添加到headers列表的开头。默认情况下,头文件将安装在<prefix>/include/pythonX.X/<config.name.replace('.','/')>/目录下。如果files项是一个元组,则它的第一个参数指定了相对于<prefix>/include/pythonX.X/路径的安装后缀。这是一个 Python distutils 方法;在 NumPy 和 SciPy 中应该使用config.add_data_files(*files)

config.add_scripts(*files) — 将files添加到scripts列表的开头。脚本将安装在<prefix>/bin/目录下。

config.add_extension(name,sources,**kw) — 创建并将一个Extension实例添加到ext_modules列表中。第一个参数name定义了扩展模块的名称,该扩展模块将安装在config.name包下。第二个参数是一个源列表。add_extension方法还接受将传递给Extension构造函数的关键字参数。允许的关键字列表如下:include_dirsdefine_macrosundef_macroslibrary_dirslibrariesruntime_library_dirsextra_objectsextra_compile_argsextra_link_argsexport_symbolsswig_optsdependslanguagef2py_optionsmodule_dirsextra_infoextra_f77_compile_argsextra_f90_compile_args

请注意,config.paths方法适用于可能包含路径的所有列表。extra_info是一个字典或字典列表,其内容将追加到关键字参数。depends列表包含扩展模块源代码依赖的文件或目录路径。如果depends列表中的任何路径都比扩展模块新,那么模块将被重新构建。

源列表可能包含函数(‘源生成器’),其模式为def <funcname>(ext, build_dir): return <source(s) or None>。如果funcname返回None,则不会生成任何源代码。如果所有源生成器处理后Extension实例没有源代码,那么不会构建扩展模块。这是有条件地定义扩展模块的推荐方法。源生成器函数由numpy.distutilsbuild_src子命令调用。

例如,这是一个典型的源生成器函数:

代码语言:javascript复制
def generate_source(ext,build_dir):
    import os
    from distutils.dep_util import newer
    target = os.path.join(build_dir,'somesource.c')
    if newer(target,__file__):
        # create target file
    return target 

第一个参数包含 Extension 实例,可以用于访问其属性,如dependssources等列表,并在构建过程中对其进行修改。第二个参数给出了一个构建目录的路径,在将文件写入磁盘时必须使用该目录。

config.add_library(name, sources, **build_info) — 向libraries列表添加一个库。允许的关键字参数有dependsmacrosinclude_dirsextra_compiler_argsf2py_optionsextra_f77_compile_argsextra_f90_compile_args。有关参数的更多信息,请参见.add_extension()方法。

config.have_f77c() — 如果 Fortran 77 编译器可用,则返回 True(即:简单的 Fortran 77 代码编译成功)。

config.have_f90c() — 如果 Fortran 90 编译器可用,则返回 True(即:简单的 Fortran 90 代码编译成功)。

config.get_version() — 返回当前包的版本字符串,如果无法检测到版本信息,则返回None。该方法扫描文件__version__.py<packagename>_version.pyversion.py__svn_version__.py以查找字符串变量version__version__<packagename>_version

config.make_svn_version_py() — 向data_files列表附加一个数据函数,该函数将生成__svn_version__.py文件到当前包目录。当 Python 退出时,将从源目录中删除该文件。

config.get_build_temp_dir() — 返回一个临时目录的路径。这是构建临时文件的地方。

config.get_distribution() — 返回 distutils 的Distribution实例。

config.get_config_cmd() — 返回numpy.distutils配置命令实例。

config.get_info(*names)

使用模板转换.src文件

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

此模板转换器将根据‘<…>’中的规则复制文件中所有的函数子程序块,名字中含有‘<…>’的。‘<…>’中以逗号分隔的单词的数量决定了块的重复次数。这些单词指示了在每个块中将重复规则‘<…>’替换为什么内容。块中的所有重复规则必须包含相同数量的逗号分隔的单词,以指示该块应该重复多少次。如果重复规则中的单词需要逗号、箭头或右箭头,则在其前面添加反斜杠‘ '。如果重复规则中的单词与‘ <index>’匹配,则会被替换为相同重复规范中的第个单词。重复规则有两种形式:命名和短形式。

命名的重复规则

命名的重复规则在一个块中多次使用相同重复集时很有用。它使用<rule1=item1, item2, item3,…, itemN>的格式指定,其中 N 是应该重复该块的次数。在每个块的重复中,整个表达式‘<…>’将首先替换为 item1,然后替换为 item2,以此类推,直到完成 N 次重复。一旦引入了命名的重复规范,相同的重复规则可以通过只引用名称(即)在当前块中使用。

短形式的重复规则

短形式的重复规则的格式为<item1, item2, item3, …, itemN>。该规则指定整个表达式‘<…>’应首先替换为 item1,然后替换为 item2,以此类推,直到完成 N 次重复。

预定义名称

可用的预定义命名重复规则如下:

  • <prefix=s,d,c,z>
  • <_c=s,d,c,z>
  • <_t=real, double precision, complex, double complex>
  • <ftype=real, double precision, complex, double complex>
  • <ctype=float, double, complex_float, complex_double>
  • <ftypereal=float, double precision, , 1>
  • <ctypereal=float, double, , 1>
其他文件

非 Fortran 文件使用单独的语法来定义应使用类似于 Fortran 特定重复的命名重复规则的模板块的变量扩展。

NumPy Distutils 预处理以自定义模板语言编写的 C 源文件(扩展名:.c.src)以生成 C 代码。@符号用于包装宏样式的变量,以实现可能描述(例如)一组数据类型的字符串替换机制。

模板语言块由/**begin repeat/**end repeat**/行进行界定,这些界定行也可以使用连续编号的界定行(如/**begin repeat1/**end repeat1**/)进行嵌套:

  1. /**begin repeat单独一行标志着应该重复的段的开始。
  2. 使用#name=item1, item2, item3, ..., itemN#定义命名变量扩展,并放置在连续的行上。这些变量会在每个重复块中被相应的词替换。同一重复块中的所有命名变量必须定义相同数量的词。
  3. 在为命名变量指定重复规则时,item*Nitem, item, ..., item重复 N 次的简写。此外,结合*N的括号可用于对应多个应该重复的项进行分组。因此,#name=(item1, item2)*4#等同于#name=item1, item2, item1, item2, item1, item2, item1, item2#
  4. 单独一行上的*/标记结束变量扩展命名。下一行是将使用命名规则重复的第一行。
  5. 在要重复的块内,应扩展的变量被指定为@name@
  6. 单独一行上的/**end repeat**/标记前一行为要重复的块的最后一行。
  7. NumPy C 源代码中的循环可能具有@TYPE@变量,用于字符串替换,预处理为具有多个字符串(如INTLONGUINTULONG等)的通常相同的循环。因此,@TYPE@样式语法通过模仿具有通用类型支持的语言来减少代码重复和维护负担。

以上规则在以下模板源示例中可能更清晰:

代码语言:javascript复制
 1  /* TIMEDELTA to non-float types */
 2
 3  /**begin repeat 4 *
 5 * #TOTYPE = BYTE, UBYTE, SHORT, USHORT, INT, UINT, LONG, ULONG,
 6 *           LONGLONG, ULONGLONG, DATETIME,
 7 *           TIMEDELTA#
 8 * #totype = npy_byte, npy_ubyte, npy_short, npy_ushort, npy_int, npy_uint,
 9 *           npy_long, npy_ulong, npy_longlong, npy_ulonglong,
10 *           npy_datetime, npy_timedelta#
11 */
12
13  /**begin repeat1 14 *
15 * #FROMTYPE = TIMEDELTA#
16 * #fromtype = npy_timedelta#
17 */
18  static  void
19  @FROMTYPE@_to_@TOTYPE@(void *input, void *output, npy_intp n,
20  void  *NPY_UNUSED(aip),  void  *NPY_UNUSED(aop))
21  {
22  const  @fromtype@ *ip = input;
23  @totype@ *op = output;
24
25  while  (n--)  {
26  *op    =  (@totype@)*ip  ;
27  }
28  }
29  /**end repeat1**/ 30
31  /**end repeat**/ 

通用类型 C 源文件的预处理(无论是 NumPy 本身还是使用 NumPy Distutils 的任何第三方包中的文件)由conv_template.py执行。在构建过程中由这些模块生成的特定类型 C 文件(扩展名:.c)已准备好进行编译。这种通用类型的形式也支持 C 头文件(预处理以生成.h文件)。

numpy.distutils.misc_util中的有用函数
  • get_numpy_include_dirs() — 返回 NumPy 基础包含目录的列表。NumPy 基础包含目录包含诸如numpy/arrayobject.hnumpy/funcobject.h等头文件。对于已安装的 NumPy,返回的列表长度为 1,但在构建 NumPy 时,列表可能包含更多目录,例如,numpy/base/setup.py文件生成并被numpy头文件使用的config.h文件路径。
  • append_path(prefix,path) — 智能地将path附加到prefix
  • gpaths(paths, local_path='') — 对路径应用 glob 并在需要时添加local_path前缀。
  • njoin(*path) — 连接路径名组件 将/分隔路径转换为os.sep分隔路径并解析路径中的...。例如,njoin('a',['b','./c'],'..','g') -> os.path.join('a','b','g')
  • minrelpath(path) — 解析path中的点号。
  • rel_path(path, parent_path) — 返回相对于parent_pathpath
  • def get_cmd(cmdname,_cache={}) — 返回numpy.distutils命令实例。
  • all_strings(lst)
  • has_f_sources(sources)
  • has_cxx_sources(sources)
  • filter_sources(sources) — 返回c_sources, cxx_sources, f_sources, fmodule_sources
  • get_dependencies(sources)
  • is_local_src_dir(directory)
  • get_ext_source_files(ext)
  • get_script_files(scripts)
  • get_lib_source_files(lib)
  • get_data_files(data)
  • dot_join(*args) — 用点连接非零参数。
  • get_frame(level=0) — 返回给定级别调用堆栈中的帧对象。
  • cyg2win32(path)
  • mingw32() — 在使用 mingw32 环境时返回True
  • terminal_has_colors(), red_text(s), green_text(s), yellow_text(s), blue_text(s), cyan_text(s)
  • get_path(mod_name,parent_path=None) — 在给定时,返回相对于 parent_path 的模块路径。也处理__main____builtin__模块。
  • allpath(name) — 在name中将/替换为os.sep
  • cxx_ext_match, fortran_ext_match, f90_ext_match, f90_module_name_match
numpy.distutils.system_info 模块
  • get_info(name,notfound_action=0)
  • combine_paths(*args,**kws)
  • show_all()
numpy.distutils.cpuinfo 模块
  • cpuinfo
numpy.distutils.log 模块
  • set_verbosity(v)
numpy.distutils.exec_command 模块
  • get_pythonexe()
  • find_executable(exe, path=None)
  • exec_command( command, execute_in='', use_shell=None, use_tee=None, **env )

__init__.py 文件

典型 SciPy __init__.py 的头部是:

代码语言:javascript复制
"""
Package docstring, typically with a brief description and function listing.
"""

# import functions into module namespace
from .subpackage import *
...

__all__ = [s for s in dir() if not s.startswith('_')]

from numpy.testing import Tester
test = Tester().test
bench = Tester().bench 

NumPy Distutils 中的额外功能

在 setup.py 脚本中为库指定 config_fc 选项

可以在 setup.py 脚本中指定 config_fc 选项。例如,使用

config.add_library(‘library’, sources=[…], config_fc={‘noopt’

0 人点赞