使用Sphinx和distutils构建的C扩展名

问题描述 投票:7回答:2

我已经编写了一个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

所以,我该如何配置distutils setup.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])
python distutils python-sphinx
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文档稀疏,here you'll find one-liners关于存在哪种构建。


2
投票

有更简单的方法来获取构建目录名称:

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

我会让您完成字符串连接:)

解决问题的另一种方法是在setup.py旁边创建一个具有以下内容的setup.cfg文件:

[build_ext]
inplace = 1

这将在其父软件包目录中构建扩展模块。狮身人面像应该看到它。

© www.soinside.com 2019 - 2024. All rights reserved.