Python设置脚本扩展,如何包含.h文件?
我有一个文件夹,里面的结构大概是这样的:
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
的时候成功编译了。