2011-01-14 10 views
6

Ich habe ein Python-Modul geschrieben, das ein in C geschriebenes Submodul enthält: Das Modul heißt foo und der C-Teil ist foo._bar. Die Struktur sieht so aus:Verwenden von Sphinx mit einer distutils-gebauten C-Erweiterung

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

foo/__init__.py Importe _bar es zu erweitern, und die nützlichen Dinge in der foo Modul ausgesetzt. Dies funktioniert gut, wenn es gebaut wird, aber offensichtlich wird nicht in kompilierter Form arbeiten, da _bar nicht existiert, bis es gebaut ist.

Ich möchte Sphinx verwenden, um das Projekt zu dokumentieren, und die autodoc Erweiterung auf dem foo Modul verwenden. Das bedeutet, dass ich das Projekt erstellen muss, bevor ich die Dokumentation erstellen kann.

Da ich mit distutils gebaut habe, endet das eingebaute Modul in einem variabel benannten Verzeichnis build/lib.linux-ARCH-PYVERSION - was bedeutet, dass ich das Verzeichnis nicht einfach in eine Sphinx 'conf.py codieren kann.

Also, wie konfiguriere ich meine Distutils setup.py Skript, um den Sphinx-Builder über das eingebaute Modul laufen zu lassen?

Für Vollständigkeit, hier ist der Aufruf von setup (die ‚fake‘ Dinge sind benutzerdefinierte Builder, die build und build_ext Unterklasse):

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]) 

Antwort

4

Seit distutils hat einen Ausweg Pfad die Variable Build von herauszufinden, warum nicht benutze es einfach?

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 

dachte Auch die distutils docs spärlich sind, here you'll find one-liners darüber, welche Arten von Build sind.

+0

Das ist ein ziemlich guter Ansatz - ich könnte das richtig in 'conf.py' (denke ich) setzen. Ich werde es morgen versuchen. – detly

+1

Aha ... Ich musste 'build_lib', nicht' build_temp' verwenden und mit meiner Cross-Kompilation herumspielen, aber es scheint zu funktionieren (und auch auf dem Erweiterungsteil, als zusätzlichen Bonus!) – detly

+0

Cool, wenn Sie möchten, dass ich weitere Details hinzufügen kann (oder fügen Sie eine Antwort mit Ihren genauen Schritten hinzu, damit andere davon profitieren können). – TryPyPy

2

Es gibt einfachere Wege, um die Build-Verzeichnis-Namen zu erhalten:

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

Ich lasse Sie die String-Verkettung fertig :)

Eine andere Möglichkeit, das Problem zu lösen, ist eine setup.cfg zu erstellen Datei neben Ihrem setup.py mit diesem Inhalt:

[build_ext] 
inplace = 1 

Dies wird Ihre Erweiterungsmodule in seinem übergeordneten Paketverzeichnis erstellen. Sphinx sollte es sehen.

Verwandte Themen