Упаковщик (numpy.distutils)
NumPy предоставляет расширенную функциональность distutils, чтобы упростить сборку и установку подпакетов, автоматическую генерацию кода и модулей расширения, которые используют библиотеки, скомпилированные на Fortran. Для использования функций NumPy distutils используйте команду setup из numpy.distutils.core. Также предоставляется полезный класс Configuration в numpy.distutils.misc_util, который может упростить создание ключевых аргументов для передачи функции setup (передавая словарь, полученный из метода todict() класса). Дополнительную информацию можно найти в Руководство пользователя NumPy Distutils.
Модули в numpy.distutils
misc_util
get_numpy_include_dirs() | |
dict_append(d, **kws) | |
appendpath(prefix, path) | |
allpath(name) | Преобразует путь с разделителями «/» в путь с использованием разделителя пути ОС. |
dot_join(*args) | |
generate_config_py(target) | Генерирует файл config.py, содержащий информацию system_info, используемую при сборке пакета. |
get_cmd(cmdname[, _cache]) | |
terminal_has_colors() | |
red_text(s) | |
green_text(s) | |
yellow_text(s) | |
blue_text(s) | |
cyan_text(s) | |
cyg2win32(path) | |
all_strings(lst) | Возвращает True, если все элементы в lst являются строками. |
has_f_sources(sources) | Возвращает True, если sources содержит файлы Fortran. |
has_cxx_sources(sources) | Возвращает True, если sources содержит файлы C++. |
filter_sources(sources) | Возвращает четыре списка имен файлов, содержащих соответственно C, C++, Fortran и Fortran 90 модули исходного кода. |
get_dependencies(sources) | |
is_local_src_dir(directory) | Возвращает True, если directory — локальный каталог. |
get_ext_source_files(ext) | |
get_script_files(scripts) |
-
class numpy.distutils.misc_util.Configuration(package_name=None, parent_name=None, top_path=None, package_path=None, **attrs)[source] -
Создайте экземпляр конфигурации для данного имени пакета. Если parent_name не равно None, то создайте пакет как подпакет пакета parent_name. Если top_path и package_path равны None, то они предполагаются равными пути к файлу, в котором был создан этот экземпляр. Файлы setup.py в дистрибутиве numpy являются хорошими примерами использования экземпляра
Configuration.-
todict()[source] -
Возвращает словарь, совместимый с аргументами ключевых слов функции distutils setup.
Примеры
>>> setup(**config.todict())
-
get_distribution()[source] -
Возвращает объект распределения distutils для self.
-
get_subpackage(subpackage_name, subpackage_path=None, parent_name=None, caller_level=1)[source] -
Возвращает список конфигураций подпакетов.
Параметры: -
subpackage_name : str or None -
Имя подпакета для получения конфигурации. ‘*’ в subpackage_name обрабатывается как символ подстановки.
-
subpackage_path : str -
Если None, то путь предполагается равным локальному пути плюс subpackage_name. Если файл setup.py не найден в subpackage_path, то используется конфигурация по умолчанию.
-
parent_name : str -
Имя родительского пакета.
-
-
add_subpackage(subpackage_name, subpackage_path=None, standalone=False)[source] -
Добавляет подпакет в текущий экземпляр Configuration.
Это полезно в скрипте setup.py для добавления подпакетов к пакету.
Параметры: -
subpackage_name : str -
имя подпакета
-
subpackage_path : str -
если указано, путь к подпакету, например, подпакет находится в subpackage_path / subpackage_name. Если None, то подпакет предполагается расположенным в локальном пути / subpackage_name.
-
standalone : bool
-
-
add_data_files(*files)[source] -
Добавляет данные файлы к данным файла data_files.
Параметры: -
files : sequence -
Аргумент(ы) могут быть
- 2-последовательность (<префикс каталога данных>,<путь к файлу данных>)
- пути к файлам данных, где префикс каталога данных python по умолчанию равен каталогу пакета.
Примечания
Формат каждого элемента последовательности файлов очень гибкий, позволяя множество комбинаций того, откуда взять файлы из дистрибутива пакета и куда их в конечном итоге установить в системе. Наиболее простое использование заключается в том, что элемент последовательности аргументов files является простым именем файла. Это приведет к установке этого файла из локального пути в путь установки пакета self.name (путь пакета). Аргумент файла также может быть относительным путем, в этом случае весь относительный путь будет установлен в директорию пакета. Наконец, файл может быть абсолютным путем, в этом случае файл будет найден по абсолютному пути, но установлен в путь пакета.
Это основное поведение может быть дополнено передачей кортежа из двух элементов в качестве аргумента файла. Первый элемент кортежа должен указывать относительный путь (внутри каталога установки пакета), в который должны быть установлены оставшиеся последовательности файлов (он не имеет отношения к именам файлов в дистрибутиве исходного пакета). Второй элемент кортежа - это последовательность файлов, которые должны быть установлены. Файлы в этой последовательности могут быть именами файлов, относительными путями или абсолютными путями. Для абсолютных путей файл будет установлен в каталог установки пакета верхнего уровня (независимо от первого аргумента). Имена файлов и относительные пути будут установлены в каталог установки пакета по указанному пути в виде первого элемента кортежа.
Правила для путей установки:
- file.txt -> (., file.txt)-> parent/file.txt
- foo/file.txt -> (foo, foo/file.txt) -> parent/foo/file.txt
- /foo/bar/file.txt -> (., /foo/bar/file.txt) -> parent/file.txt
-
*.txt -> parent/a.txt, parent/b.txt - foo/
*.txt`` -> parent/foo/a.txt, parent/foo/b.txt -
*/*.txt-> (*,*/*.txt) -> parent/c/a.txt, parent/d/b.txt - (sun, file.txt) -> parent/sun/file.txt
- (sun, bar/file.txt) -> parent/sun/file.txt
- (sun, /foo/bar/file.txt) -> parent/sun/file.txt
- (sun,
*.txt) -> parent/sun/a.txt, parent/sun/b.txt - (sun, bar/
*.txt) -> parent/sun/a.txt, parent/sun/b.txt - (sun/
*,*/*.txt) -> parent/sun/c/a.txt, parent/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где <каталог установки пакета> - это каталог пакета (или подпакета), например, ‘/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)[source] -
Рекурсивно добавляет файлы в data_path в список data_files.
Рекурсивно добавляет файлы в data_path в список файлов data_files, которые должны быть установлены (и распространены). data_path может быть относительным именем файла, абсолютным именем файла или кортежем из двух элементов, где первый элемент показывает, куда в каталог установки должен быть установлен каталог данных.
Параметры: -
data_path : seq or str -
Аргумент может быть
- 2-последовательность (<суффикс каталога данных>, <путь к каталогу данных>)
- путь к каталогу данных, где суффикс каталога данных python по умолчанию равен каталогу пакета.
Примечания
Правила для путей установки:
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)[source] -
Добавляет пути в каталоги include конфигурации.
Добавляет данную последовательность путей в начало списка include_dirs. Этот список будет виден всем модулям расширения текущего пакета.
-
add_headers(*files)[source] -
Добавляет устанавливаемые заголовки в конфигурацию.
Добавляет данную последовательность файлов в начало списка заголовков. По умолчанию заголовки будут установлены в каталоге <python- include>/<self.name.replace(‘.’,’/’)>/ . Если элемент файлов является кортежем, то его первый аргумент указывает фактическое место установки относительно пути <python-include>.
Параметры: -
files : str or seq -
Аргумент(ы) могут быть:
- 2-последовательность (<суффикс includedir>,<путь к файлу заголовка>)
- путь(и) к файлу(ам) заголовка, где суффикс includedir python по умолчанию будет равен имени пакета.
-
-
-
add_extension(name, sources, **kw)[source] -
Добавить расширение в конфигурацию.
Создаёт и добавляет экземпляр Extension в список ext_modules. Этот метод также принимает следующие необязательные ключевые аргументы, которые передаются в конструктор Extension.
Параметры: -
name : str -
имя расширения
-
sources : seq -
список источников. Список источников может содержать функции (называемые генераторами источников), которые должны принимать экземпляр расширения и директорию сборки в качестве входных данных и возвращать файл или список файлов источников, или None. Если возвращается None, то источники не генерируются. Если у экземпляра Extension нет источников после обработки всех генераторов источников, то модуль расширения не будет построен.
- include_dirs :
- define_macros :
- undef_macros :
- library_dirs :
- libraries :
- runtime_library_dirs :
- extra_objects :
- extra_compile_args :
- extra_link_args :
- extra_f77_compile_args :
- extra_f90_compile_args :
- export_symbols :
- swig_opts :
- depends :
-
Список depends содержит пути к файлам или директориям, от которых зависят исходные файлы модуля расширения. Если любой путь в списке depends новее, чем модуль расширения, то модуль будет перестроен.
- language :
- f2py_options :
- module_dirs :
-
extra_info : dict or list -
словарь или список словарей с ключевыми словами, которые нужно добавить в ключевые слова.
Примечания
Метод self.paths(…) применяется ко всем спискам, которые могут содержать пути.
-
-
add_library(name, sources, **build_info)[source] -
Добавить библиотеку в конфигурацию.
Параметры: -
name : str -
Имя расширения.
-
sources : sequence -
Список источников. Список источников может содержать функции (называемые генераторами источников), которые должны принимать экземпляр расширения и директорию сборки в качестве входных данных и возвращать файл или список файлов источников, или None. Если возвращается None, то источники не генерируются. Если у экземпляра Extension нет источников после обработки всех генераторов источников, то модуль расширения не будет построен.
-
build_info : dict, optional -
Допускаются следующие ключи:
- depends
- macros
- include_dirs
- extra_compiler_args
- extra_f77_compile_args
- extra_f90_compile_args
- f2py_options
- language
-
-
add_scripts(*files)[source] -
Добавить скрипты в конфигурацию.
Добавляет последовательность файлов в начало списка скриптов. Скрипты будут установлены в директории <prefix>/bin/.
-
add_installed_library(name, sources, install_dir, build_info=None)[source] -
Аналогично add_library, но указанная библиотека устанавливается.
Большинство C-библиотек, используемых с
distutils, используются только для построения расширений Python, но библиотеки, построенные с помощью этого метода, будут установлены, чтобы их можно было повторно использовать сторонними пакетами.Параметры: -
name : str -
Имя устанавливаемой библиотеки.
-
sources : sequence -
Список исходных файлов библиотеки. См.
add_libraryдля подробностей. -
install_dir : str -
Путь для установки библиотеки, относительно текущего подпакета.
-
build_info : dict, optional -
Допускаются следующие ключи:
- depends
- macros
- include_dirs
- extra_compiler_args
- extra_f77_compile_args
- extra_f90_compile_args
- f2py_options
- language
Возвращает: - None
См. также
Примечания
Лучший способ кодирования опций, необходимых для связи с указанными C-библиотеками, — это использование файла «libname.ini», и использование
get_infoдля извлечения необходимых опций (см.add_npy_pkg_configдля получения дополнительной информации). -
-
add_npy_pkg_config(template, install_dir, subst_dict=None)[source] -
Генерировать и установить файл конфигурации npy-pkg из шаблона.
Файл конфигурации, сгенерированный из
template, устанавливается в указанную директорию установки с использованиемsubst_dictдля подстановки переменных.Параметры: -
template : str -
Путь к шаблону, относительно пути к текущему пакету.
-
install_dir : str -
Куда установить файл конфигурации npy-pkg, относительно пути к текущему пакету.
-
subst_dict : dict, optional -
Если указано, любая строка вида
@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».
-
-
paths(*paths, **kws)[source] -
Применить glob к путям и, при необходимости, добавить local_path в начало.
Применяет glob.glob(…) к каждому пути в последовательности (если необходимо) и добавляет local_path в начало, если это необходимо. Поскольку это вызывается для всех списков источников, это позволяет указывать символы подстановки в списках источников для модулей расширения, библиотек и скриптов, а также позволяет указывать имена путей относительно директории исходных файлов.
-
get_config_cmd()[source] -
Возвращает экземпляр команды конфигурации numpy.distutils.
-
get_build_temp_dir()[source] -
Возвращает путь к временной директории, куда следует помещать временные файлы.
-
-
have_f77c()[source] -
Проверка наличия компилятора Fortran 77.
Используется внутри функции генерации исходного кода для проверки инициализации экземпляра распределения setup.
Примечания
True, если компилятор Fortran 77 доступен (потому что простой код Fortran 77 был успешно скомпилирован).
-
have_f90c()[source] -
Проверка наличия компилятора Fortran 90.
Используется внутри функции генерации исходного кода для проверки инициализации экземпляра распределения setup.
Примечания
True, если компилятор Fortran 90 доступен (потому что простой код Fortran 90 был успешно скомпилирован).
-
get_version(version_file=None, version_variable=None)[source] -
Попытка получить строку версии пакета.
Возвращает строку версии текущего пакета или None, если информация о версии не может быть обнаружена.
Примечания
Этот метод сканирует файлы __version__.py, <имя_пакета>_version.py, version.py и __svn_version__.py в поисках строковых переменных version, __version__ и <имя_пакета>_version, пока не найдёт номер версии.
-
make_svn_version_py(delete=True)[source] -
Добавляет функцию данных в список data_files, которая сгенерирует файл __svn_version__.py в текущем каталоге пакета.
Генерирует файл пакета __svn_version__.py из номера ревизии SVN. Он будет удалён после завершения работы Python, но будет доступен при выполнении команд sdist и т.п.
Примечания
Если __svn_version__.py уже существовал, ничего не делается.
Это предназначено для работы с каталогами исходных файлов, находящихся в хранилище SVN.
-
make_config_py(name='__config__')[source] -
Генерирует файл пакета __config__.py, содержащий информацию system_info, используемую во время сборки пакета.
Этот файл устанавливается в каталог установки пакета.
-
get_info(*names)[source] -
Получение информации о ресурсах.
Возвращает информацию (из system_info.get_info) для всех имён в списке аргументов в одном словаре.
-
Другие модули
system_info.get_info(name[, notfound_action]) | notfound_action: 0 - ничего не делать 1 - отобразить сообщение об ошибке 2 - вызвать ошибку |
system_info.get_standard_file(fname) | Возвращает список файлов с именем ‘fname’ из 1) системного каталога (каталог расположения данного модуля) 2) каталога пользователя HOME (os.environ[‘HOME’]) 3) локального каталога |
cpuinfo.cpu | |
log.set_verbosity(v[, force]) | |
exec_command | exec_command |
Создание устанавливаемых библиотек C
Традиционные библиотеки C (устанавливаемые через add_library) не устанавливаются и просто используются во время сборки (они статически подключаются). Устанавливаемая библиотека C — это чистая библиотека C, которая не зависит от C-времени выполнения Python, и устанавливается так, чтобы её могли использовать сторонние пакеты. Чтобы создать и установить библиотеку C, просто используйте метод add_installed_library вместо add_library, который принимает те же аргументы, кроме дополнительного аргумента install_dir.
>>> config.add_installed_library('foo', sources=['foo.c'], install_dir='lib')
Файлы npy-pkg-config
Чтобы предоставить необходимые параметры сборки сторонним участникам, можно использовать механизм npy-pkg-config реализованный в numpy.distutils. Этот механизм основан на файле .ini, который содержит все параметры. Файл .ini очень похож на файлы .pc, используемые утилитой pkg-config для Unix.
[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 в каталог package_dir/lib, а файл foo.ini будет сгенерирован из foo.ini.in, где каждый @version@ будет заменён на subst_dict['version']. Словарь автоматически дополнен правилом подстановки префикса, содержащим префикс установки (так как его трудно получить из setup.py). Файлы npy-pkg-config также могут быть установлены в том же месте, что и NumPy, используя путь, возвращённый функцией get_npy_pkg_dir.
Использование библиотеки C из другого пакета
Информация легко извлекается из функции get_info в numpy.distutils.misc_util:
>>> info = get_info('npymath')
>>> config.add_extension('foo', sources=['foo.c'], extra_info=**info)
Дополнительный список путей для поиска файлов .ini можно передать функции get_info.
Преобразование файлов .src
NumPy distutils поддерживает автоматическое преобразование исходных файлов с именем <некоторое_имя_файла>.src. Эта функция может использоваться для поддержания очень похожих блоков кода, требующих лишь простых изменений между блоками. Во время фазы сборки setup, если встречен шаблонный файл с именем <некоторое_имя_файла>.src, новый файл с именем <некоторое_имя_файла> строится из шаблона и помещается в каталог сборки для использования вместо него. Поддерживаются два вида преобразования шаблонов. Первый вид происходит для файлов с именем <файл>.ext.src, где ext — это распознаваемое расширение Fortran (f, f90, f95, f77, for, ftn, pyf). Второй вид используется для всех остальных случаев.
Файлы Fortran
Этот преобразователь шаблонов будет дублировать все блоки функций и подпрограмм в файле с именами, содержащими «<…>», согласно правилам в «<…>». Количество слов, разделённых запятыми в «<…>», определяет количество повторений блока. Значения этих слов указывают, чем следует заменить выражение «<…>» в каждом блоке. Все правила повторения в блоке должны содержать одинаковое количество слов, разделённых запятыми, указывающее количество повторений блока. Если слово в правиле повторения требует запятую, стрелку влево или стрелку вправо, предваряйте его обратной косой чертой «\». Если слово в правиле повторения соответствует «\\<индекс>», оно будет заменено на <индекс>-е слово в том же правиле повторения. Существует два вида правил повторения: именованное и короткое.
Именованное правило повторения
Именованное правило повторения полезно, когда один и тот же набор повторений должен использоваться несколько раз в блоке. Оно задаётся как <правило1=элемент1, элемент2, элемент3,…, элементN>, где N — количество повторений блока. При каждом повторении блока всё выражение «<…>» будет заменено сначала на элемент1, затем на элемент2 и так далее, пока не будет выполнено N повторений. После введения именованного правила повторения то же правило повторения может быть использовано в текущем блоке, ссылаясь только на имя (т.е. <правило1>.
Короткое правило повторения
Короткое правило повторения выглядит как <элемент1, элемент2, элемент3, …, элементN>. Правило указывает, что всё выражение «<…>» должно быть заменено сначала на элемент1, затем на элемент2 и так далее, пока не будет выполнено 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, \0, \1>
- <ctypereal=float, double, \0, \1>
Другие файлы
В не-Fortran файлах используется отдельный синтаксис для определения блоков шаблона, которые должны повторяться с помощью расширения переменных, аналогичного именованным правилам повторений для файлов Fortran. Правила шаблонов для этих файлов:
- “/**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**/” на отдельной строке отмечает предыдущую строку как последнюю строку блока, который нужно повторить.
© 2005–2019 NumPy Developers
Licensed under the 3-clause BSD License.
https://docs.scipy.org/doc/numpy-1.16.1/reference/distutils.html