Использование 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

Это создаст ваши модули расширения в каталоге родительского пакета. Сфинкс должен это увидеть.

Другие вопросы по тегам