7

我编写了一个 Python 模块,包括一个用 C 编写的子模块:模块本身被调用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中。

那么如何配置我的 distutilssetup.py脚本以在构建的模块上运行 Sphinx 构建器?

为了完整起见,这里调用(“假”的东西是子类和setup的自定义构建器):buildbuild_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 回答