2011-01-14 9 views
6

Napisałem moduł Pythona zawierający moduł podpisany w C: sam moduł nazywa się foo, a część C to foo._bar. Struktura wygląda następująco:Używanie Sphinx z rozszerzeniem C opartym na distutils

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

foo/__init__.py importu _bar aby ją poszerzyć i użyteczne rzeczy jest wystawiony w module foo. Działa to dobrze, gdy jest zbudowany, ale oczywiście nie będzie działać w formie nieskompilowanej, ponieważ _bar nie istnieje, dopóki nie zostanie zbudowany.

Chciałbym użyć Sphinx do udokumentowania projektu i użyć rozszerzenia autodoc na module foo. Oznacza to, że muszę zbudować projekt, zanim będę mógł zbudować dokumentację.

Odkąd zbudowałem z distutils, zbudowany moduł kończy się w jakimś zmiennie nazwanym dir build/lib.linux-ARCH-PYVERSION - co oznacza, że ​​nie mogę po prostu zakodować katalogu w Sphinx 'conf.py.

Jak skonfigurować skrypt distutils setup.py, aby uruchomić program budujący Sphinx na zbudowanym module?

Dla kompletności, oto wywołanie setup (rzeczy „fałszywy” są niestandardowe budowniczych że podklasa build i 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]) 

Odpowiedz

4

Od distutils ma sposób na zastanawianie się zmienną ścieżkę kompilacji, dlaczego nie po prostu go używaj?

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 

Nawet myślałem że distutils docs są skąpe, here you'll find one-liners o jakie rodzaje produkcji są tam.

+0

To całkiem dobre podejście - mógłbym to umieścić w 'conf.py' (chyba). Spróbuję tego jutro. – detly

+1

Aha ... Musiałem użyć 'build_lib', a nie' build_temp', i pomieszać z moją kompilacją krzyżową, ale wydaje się, że działa (i na części rozszerzenia też, jako dodatkowy bonus!) – detly

+0

Cool, jeśli chcesz, abym mógł dodać więcej szczegółów (lub dodać dokładną odpowiedź, aby inni mogli skorzystać). – TryPyPy

2

Są prostsze sposoby, aby uzyskać nazwę kompilacji dir:

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

dam ci dokończyć konkatenacji ciągów :)

Innym sposobem rozwiązania tego problemu jest stworzenie setup.cfg plik wraz z plikiem setup.py z tą zawartością:

[build_ext] 
inplace = 1 

Spowoduje to utworzenie modułów rozszerzeń w katalogu nadrzędnym. Sphinx powinien to zobaczyć.

Powiązane problemy