Использование Sphinx с дистрибутивом C-расширения
Я написал модуль Python, включая подмодуль, написанный на C: сам модуль называется foo
и часть C foo._bar
, Структура выглядит так:
src/
foo/__init__.py <- contains the public stuff
foo/_bar/bar.c <- the C extension
doc/ <- Sphinx configuration
conf.py
...
foo/__init__.py
импорт _bar
увеличить его, и полезный материал выставляется в foo
модуль. Это прекрасно работает, когда он построен, но, очевидно, не будет работать в некомпилированном виде, так как _bar
не существует, пока не будет построен.
Я хотел бы использовать Sphinx для документирования проекта и использовать расширение autodoc на foo
модуль. Это означает, что мне нужно построить проект, прежде чем я смогу собрать документацию.
Поскольку я собираю с помощью distutils, встроенный модуль заканчивается в некотором каталоге с переменным именем build/lib.linux-ARCH-PYVERSION
- это означает, что я не могу просто жестко закодировать каталог в сфинкса conf.py
,
Так как мне настроить мои distutils setup.py
скрипт для запуска сборщика Sphinx над встроенным модулем?
Для полноты вот звонок setup
("фальшивые" вещи - это пользовательские конструкторы, которые подклассы build
а также build_ext
):
setup(cmdclass = {
'fake': fake,
'build_ext_fake' : build_ext_fake
},
package_dir = {'': 'src'},
packages = ['foo'],
name = 'foo',
version = '0.1',
description = desc,
ext_modules = [module_real])
2 ответа
Поскольку у distutils есть способ выяснить путь сборки переменной, почему бы просто не использовать его?
import distutils.command.build
from distutils.dist import Distribution
b = distutils.command.build.build(Distribution())
b.initialize_options()
b.finalize_options()
print b.build_temp
# If you're building a library, you might need:
print b.build_lib
# Other values of interest are:
b.build_purelib
b.build_platlib
b.build_scripts
b.build_base
Даже несмотря на то, что документы distutils скудны, здесь вы найдете одну строчку о том, какие существуют типы сборок.
Есть более простые способы получить имя сборки dir:
>>> from distutils.util import get_platform
>>> get_platform()
'linux-x86_64'
Я дам тебе закончить конкатенацию строк:)
Другой способ решить вашу проблему - создать файл setup.cfg вместе с вашим setup.py с этим содержимым:
[build_ext]
inplace = 1
Это создаст ваши модули расширения в каталоге родительского пакета. Сфинкс должен это увидеть.