2011-01-14 19 views
6

He escrito un módulo de Python que incluye un submódulo escrito en C: el módulo en sí se llama foo y la parte C es foo._bar. La estructura se parece a:Uso de Sphinx con una extensión C de distutils

src/ 
    foo/__init__.py <- contains the public stuff 
    foo/_bar/bar.c <- the C extension 
doc/    <- Sphinx configuration 
    conf.py 
    ... 

foo/__init__.py importaciones _bar aumentarlo, y las cosas útiles se expone en el módulo foo. Esto funciona bien cuando está construido, pero obviamente no funcionará en forma no compilada, ya que _bar no existe hasta que se construye.

Me gustaría utilizar Sphinx para documentar el proyecto y utilizar la extensión autodoc en el módulo foo. Esto significa que necesito construir el proyecto antes de poder construir la documentación.

Como construyo con distutils, el módulo construido termina en un nombre variable llamado dir build/lib.linux-ARCH-PYVERSION - lo que significa que no puedo simplemente codificar el directorio en una Sphinx 'conf.py.

Entonces, ¿cómo configuro mi secuencia de comandos distutils setup.py para ejecutar el constructor Sphinx sobre el módulo integrado?

Para completar, aquí está la llamada a setup (las cosas 'falsas' son los constructores de encargo que subclase build y 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]) 

Respuesta

4

Desde distutils tiene una manera de averiguar la ruta de compilación variables, por qué no solo usarlo?

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 

pese a que la documentación distutils son escasos, here you'll find one-liners acerca de qué tipo de construcción están allí.

+0

Ese es un enfoque bastante bueno, podría ponerlo justo en 'conf.py' (creo). Lo intentaré mañana. – detly

+1

Aha ... Necesitaba usar 'build_lib', no' build_temp', y meterme con mi compilación cruzada, pero parece estar funcionando (¡y en la parte de la extensión también, como una bonificación adicional!) – detly

+0

Cool, if quieres puedo agregar más detalles (o agregar una respuesta con tus pasos exactos para que otros puedan beneficiarse). – TryPyPy

2

hay maneras más simples para obtener el nombre de la Estructura dir:

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

Voy a dejar que termine la concatenación de cadenas :)

Otra forma de resolver el problema es crear un setup.cfg archivo junto con su setup.py con este contenido:

[build_ext] 
inplace = 1 

Esto construirá sus módulos de extensión en su directorio principal de paquetes. Sphinx debería verlo.

Cuestiones relacionadas