我编写了一个包含用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来记录项目,并在foo
模块上使用autodoc扩展名。这意味着我需要在构建文档之前构建项目。
由于我使用distutils构建,所以构建的模块最终会出现在一些名为dir build/lib.linux-ARCH-PYVERSION
的变量中 - 这意味着我不能将目录硬编码为Sphinx'conf.py
。
那么如何配置我的distutils setup.py
脚本以在构建的模块上运行Sphinx构建器?
为了完整性,这里是对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])
答案 0 :(得分: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关于那里有什么类型的构建。
答案 1 :(得分:2)
有更简单的方法来获取构建目录名称:
>>> from distutils.util import get_platform
>>> get_platform()
'linux-x86_64'
我会让你完成字符串连接:)
解决问题的另一种方法是使用以下内容在setup.py旁边创建一个setup.cfg文件:
[build_ext]
inplace = 1
这将在其父包目录中构建扩展模块。狮身人面像应该看到它。