2011-01-14 5 views
6

Cで書かれたサブモジュールを含むPythonモジュールを作成しました。モジュール自体はfooと呼ばれ、Cの部分はfoo._barです。それを補強するためにdistutilsで構築されたC拡張モジュールでのスフィンクスの使用

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はビルドされるまで存在しないためです。

スフィンクスを使用してプロジェクトを文書化し、fooモジュールのautodoc拡張子を使用したいと思います。つまり、ドキュメントを作成する前にプロジェクトを構築する必要があります。

私はdistutilsでビルドしているので、ビルドされたモジュールは可変的にdir build/lib.linux-ARCH-PYVERSIONという名前になります。つまり、ディレクトリをSphinxのconf.pyにハードコードすることはできません。

したがって、私のdistutils setup.pyスクリプトは、ビルドされたモジュールに対してSphinxビルダーを実行するように設定しますか? distutilsの以来

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

答えて

4

は、可変のビルド・パスをなぜ考え出すの方法があります。

完全性については

、ここsetupへの呼び出しがあります(「偽」のものがbuildサブクラス化とbuild_extカスタムビルダーです)ちょうどそれを使用する?

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のドキュメントは、あるビルドのどのような種類についてhere you'll find one-linersまばらで思いました。

+0

これはかなり良いアプローチです - 私はそれを 'conf.py'に入れることができます(私は思っています)。私は明日それを試してみるよ。 – detly

+1

Aha ...私は 'build_temp'ではなく' build_lib'を使い、クロスコンパイルで混乱させる必要がありましたが、それは機能しているようです(また、拡張部分にも追加ボーナスとして!) – detly

+0

詳細を追加することができます(または、正確な手順で回答を追加して他の人に利益をもたらすことができます)。 – TryPyPy

2

ビルドディレクトリ名を取得する単純な方法があります:私はあなたが文字列の連結を終了させて​​いただきます

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

が:)

あなたの問題を解決する別の方法は、のsetup.cfgを作成することですあなたのsetup.pyと一緒にこの内容のファイルを作成してください:

[build_ext] 
inplace = 1 

これは、親パッケージディレクトリに拡張モジュールをビルドします。スフィンクスはそれを見なければなりません。

関連する問題