2011-01-14 7 views
6

C dilinde yazılan bir alt modülü içeren bir Python modülü yazdım: modülün kendisi foo ve C kısmı foo._bar'dur. Bunu artırmak içinSphinx'i bir distutil yapılı C uzantısı ile kullanma

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

foo/__init__.py ithalatı _bar ve faydalı şeyler foo modülünde maruz: yapı gibi görünüyor. Bu, oluşturulduğunda gayet iyi çalışıyor, ancak henüz oluşturulmamış formda çalışmayacaksınız, çünkü _bar, yerleşik olana kadar mevcut değil.

Projeyi belgelemek için Sphinx'i kullanmak ve foo modülündeki autodoc uzantısını kullanmak istiyorum. Bu, belgeyi oluşturabilmek için projeyi oluşturmam gerektiği anlamına geliyor.

Zor durumlarla oluşturduğumdan, yerleşik modül bazı değişken olarak adlandırılmış dir build/lib.linux-ARCH-PYVERSION olarak biter - bu da, dizini yalnızca bir Sphinx 'conf.py içine kodlayamıyorum anlamına gelir.

Sphinx oluşturucuyu yerleşik modül üzerinden çalıştırmak için setup.py komut dizilerini nasıl yapılandırabilirim? distutils yana

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

cevap

4

, değişken yapı yolunu neden olmasın endam bir yolu vardır:

Bütünlüğü için

, burada setup çağrısı var ('sahte' şeyler build alt sınıf ve build_ext özel inşaatçılar vardır) sadece kullan?

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 

bile distutils docs here you'll find one-liners yapı ne tür ilgili vardır seyrek düşündüm.

+0

Oldukça iyi bir yaklaşım - bu hakkı "conf.py" (sanırım) 'a koyabilirim. Yarın deneyeceğim. – detly

+1

Aha ... 'build_tip', 'build_temp' işlevini kullanmam ve çapraz derlememle uğraşmam gerekiyordu, ama çalışıyor gibi görünüyor (ve eklenti parçası olarak ek bir bonus olarak!) – detly

+0

Cool, eğer Daha fazla ayrıntı ekleyebilirim (veya diğer adımların faydalanabilmesi için tam adımlarınızla bir cevap ekleyebilirim). – TryPyPy

2

inşa dir adını almak için basit yolu vardır:

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

Sana dize birleştirme :)

bitirmek izin vereceğim sorunu çözmek için başka bir yol Setup.cfg yaratmaktır Bu içeriğiyle setup.py dosyanızın yanında dosya:

[build_ext] 
inplace = 1 

Bu, uzantı modüllerinizi ana paket dizininde oluşturacaktır. Sfenks görmeli.