2010-11-23 55 views
7

所以我有一个目录,它看起来是这样的: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会正确地构建它?

回答

6

我有一种感觉pyfunc正在追踪更标准的解决方案,但我确实找到了另一种解决方案。我不知道这是一个好的解决方案还是只是一个黑客,但我所做的只是将头文件添加到MANIFEST.in。该文档并没有真正使它看起来像这是MANIFEST.in文件的用途,但它确实有效。我MANIFEST.in文件现在看起来是这样的:

include ext/ext_header.h 

其中包括文件,并成功地当我运行python setup.py install

1

从文档,

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” 提供的包含文件。

为什么这不适合你?

+0

我认为这可能是正确的道路编译,但我有点困惑,什么是继续。 include_dir变量是否告诉编译器在哪里查找头文件?这将如何导致我的.h文件进入MANIFEST? – user411133 2010-11-23 18:41:23

+0

`include dirs`告诉编译器在哪里查找包含`<>`的标准头文件,例如``,``等。如果安装脚本不想打包自己的头文件文件,我认为你不应该在Python扩展中有自定义头文件。 – 2010-11-23 18:56:46

相关问题