原文:
numpy.org/doc/
numpy.distutils.misc_util
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/distutils/misc_util.html
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
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_config
,Configuration.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
实例的输入:
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_config
,Configuration.add_installed_library
get_info
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)
从路径中解析 *
和.
。
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
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/generated/numpy.distutils.cpuinfo.cpu.html
distutils.cpuinfo.cpu = <numpy.distutils.cpuinfo.LinuxCPUInfo object>
numpy.distutils.core.Extension
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/generated/numpy.distutils.core.Extension.html
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
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/generated/numpy.distutils.log.set_verbosity.html
distutils.log.set_verbosity(v, force=False)
numpy.distutils.system_info.get_info
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/generated/numpy.distutils.system_info.get_info.html
distutils.system_info.get_info(name, notfound_action=0)
notfound_action:
0 - 什么也不做 1 - 显示警告消息 2 - 引发错误
numpy.distutils.system_info.get_standard_file
代码语言:javascript复制原文:
numpy.org/doc/1.26/reference/generated/numpy.distutils.system_info.get_standard_file.html
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
文件示例:
#!/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_path
的paths
项。
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
项是元组,则其第一个元素定义了数据文件相对于软件包安装目录的后缀,第二个元素指定了数据文件的路径。默认情况下,数据文件被复制到软件包安装目录下。例如,
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
的基本名称下。例如,
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_dirs
,define_macros
,undef_macros
,library_dirs
,libraries
,runtime_library_dirs
,extra_objects
,extra_compile_args
,extra_link_args
,export_symbols
,swig_opts
,depends
,language
,f2py_options
,module_dirs
,extra_info
,extra_f77_compile_args
,extra_f90_compile_args
。
请注意,config.paths
方法适用于可能包含路径的所有列表。extra_info
是一个字典或字典列表,其内容将追加到关键字参数。depends
列表包含扩展模块源代码依赖的文件或目录路径。如果depends
列表中的任何路径都比扩展模块新,那么模块将被重新构建。
源列表可能包含函数(‘源生成器’),其模式为def <funcname>(ext, build_dir): return <source(s) or None>
。如果funcname
返回None
,则不会生成任何源代码。如果所有源生成器处理后Extension
实例没有源代码,那么不会构建扩展模块。这是有条件地定义扩展模块的推荐方法。源生成器函数由numpy.distutils
的build_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 实例,可以用于访问其属性,如depends
、sources
等列表,并在构建过程中对其进行修改。第二个参数给出了一个构建目录的路径,在将文件写入磁盘时必须使用该目录。
config.add_library(name, sources, **build_info)
— 向libraries
列表添加一个库。允许的关键字参数有depends
、macros
、include_dirs
、extra_compiler_args
、f2py_options
、extra_f77_compile_args
、extra_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.py
、version.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**/
)进行嵌套:
-
/**begin repeat
单独一行标志着应该重复的段的开始。 - 使用
#name=item1, item2, item3, ..., itemN#
定义命名变量扩展,并放置在连续的行上。这些变量会在每个重复块中被相应的词替换。同一重复块中的所有命名变量必须定义相同数量的词。 - 在为命名变量指定重复规则时,
item*N
是item, item, ..., item
重复 N 次的简写。此外,结合*N
的括号可用于对应多个应该重复的项进行分组。因此,#name=(item1, item2)*4#
等同于#name=item1, item2, item1, item2, item1, item2, item1, item2#
。 - 单独一行上的
*/
标记结束变量扩展命名。下一行是将使用命名规则重复的第一行。 - 在要重复的块内,应扩展的变量被指定为
@name@
。 - 单独一行上的
/**end repeat**/
标记前一行为要重复的块的最后一行。 - NumPy C 源代码中的循环可能具有
@TYPE@
变量,用于字符串替换,预处理为具有多个字符串(如INT
、LONG
、UINT
、ULONG
等)的通常相同的循环。因此,@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.h
、numpy/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_path
的path
。 -
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
的头部是:
"""
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’