7

私はCで書かれたサブモジュールを含むPythonモジュールを書きました:モジュール自体が呼び出されfoo、C部分はfoo._barです。構造は次のようになります。

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これはビルド時に正常に機能しますが、ビルドされるまで存在しないため、コンパイルされていない形式では明らかに機能しません。

Sphinxを使用してプロジェクトを文書化し、モジュールでautodoc拡張機能を使用したいと思いfooます。これは、ドキュメントを作成する前にプロジェクトを作成する必要があることを意味します。

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

setup.pyでは、ビルドされたモジュールに対してSphinxビルダーを実行するようにdistutilsスクリプトを構成するにはどうすればよいですか?

完全を期すために、ここに次の呼び出しがありますsetup(「偽の」ものはサブクラス化するカスタムビルダーでbuildあり、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])
4

2 に答える 2

5

distutilsには可変ビルドパスを把握する方法があるので、それを使用してみませんか?

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のドキュメントはまばらですが、ここでは、どのような種類のビルドがあるかについてのワンライナーを見つけることができます。

于 2011-01-16T06:17:12.443 に答える
2

ビルドディレクトリ名を取得する簡単な方法があります。

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

文字列の連結を終了させます:)

問題を解決する別の方法は、setup.pyと一緒に次のコンテンツを含むsetup.cfgファイルを作成することです。

[build_ext]
inplace = 1

これにより、親パッケージディレクトリに拡張モジュールが構築されます。スフィンクスはそれを見るはずです。

于 2011-10-09T10:01:18.977 に答える