Python设置脚本扩展,如何包含.h文件?

13 投票
2 回答
4848 浏览
提问于 2025-04-16 07:30

我有一个文件夹,里面的结构大概是这样的:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h

显然,头文件是编译C文件时必须的,但问题是我无法让设置脚本包含这个头文件。

我的扩展对象大概是这样的:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])

这个是可以工作的,但没有包含头文件。如果我把它改成:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c', 'ext_header.h'])

这样就包含了'.h'文件,但在我运行安装时却无法构建。相反,它给出了一个错误 error: unknown file type '.h' (from 'ext/ext_header.h')

如果我像这样把头文件当作数据文件包含:

data_files=[('ext', ['ext/ext_header.h'])]

那就完全不行,.h文件甚至没有出现在MANIFEST文件里。

所以我的问题是,怎么才能把这个扩展和头文件一起包含,这样 python setup.py install 就能正确构建它呢?

2 个回答

2

根据文档的说明,

module1 = Extension('demo',
                define_macros = [('MAJOR_VERSION', '1'),
                                 ('MINOR_VERSION', '0')],
                include_dirs = ['/usr/local/include'],
                libraries = ['tcl83'],
                library_dirs = ['/usr/local/lib'],
                sources = ['demo.c'])

你应该通过“include_dirs”来提供包含的文件。

那为什么这对你来说不管用呢?

9

我觉得pyfunc的方向可能会有一个更标准的解决方案,但我自己找到了另一个方法。我不知道这个方法是否好,还是只是个临时解决办法,不过我做的就是把头文件添加到了MANIFEST.in文件里。文档里并没有明确说明MANIFEST.in文件是用来做这个的,但它确实有效。我的MANIFEST.in文件现在看起来是这样的:

include ext/ext_header.h

这样就包含了那个文件,并且在我运行python setup.py install的时候成功编译了。

撰写回答