Использование Sphinx с расширением C на основе distutils - PullRequest
7 голосов
/ 14 января 2011

Я написал модуль 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, встроенный модуль заканчивается переменным именем dir build/lib.linux-ARCH-PYVERSION, что означает, что я не могу просто жестко закодировать каталог в Sphinx '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 ]

5 голосов
/ 16 января 2011

Поскольку у 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 редки, здесь вы найдете однострочники о том, какие есть виды сборки.

2 голосов
/ 09 октября 2011

Есть более простые способы получить имя dir сборки:

>>> from distutils.util import get_platform
>>> get_platform()
'linux-x86_64'

Я дам вам закончить конкатенацию строк:)

Другой способ решить вашу проблему - создатьФайл setup.cfg вместе с вашим setup.py со следующим содержимым:

[build_ext]
inplace = 1

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

...