Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python安装脚本扩展,如何包含.h文件?_Python_C_Installation_Setup.py - Fatal编程技术网

Python安装脚本扩展,如何包含.h文件?

Python安装脚本扩展,如何包含.h文件?,python,c,installation,setup.py,Python,C,Installation,Setup.py,我有一个目录,看起来像这样: home\ setup.py some_python_file.py ext\ __init__.py c_file1.c c_file2.c ext_header.h Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c']) data_files=[('ext', ['ext/ext

我有一个目录,看起来像这样:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h
Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])
data_files=[('ext', ['ext/ext_header.h'])]
include ext/ext_header.h
显然,头文件是编译c文件所必需的,但问题是我无法让安装脚本包含头文件

我的扩展对象是这样的:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h
Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])
data_files=[('ext', ['ext/ext_header.h'])]
include ext/ext_header.h
它可以工作,但不包括头文件。如果我将其更改为:

Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c', 'ext_header.h'])
它包含“.h”文件,但在运行install时不会生成该文件。相反,它给出了一个错误
error:unknown file type'.h'(来自'ext/ext\u header.h')

如果我将头文件作为数据文件包含,如下所示:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h
Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])
data_files=[('ext', ['ext/ext_header.h'])]
include ext/ext_header.h
它根本不起作用,.h文件甚至没有进入清单文件

因此,我的问题是,如何在头文件中包含此扩展名,以便
python setup.py install
能够正确地构建它?

来自文档

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


为什么这对您不起作用?

我感觉pyfunc正在寻找一种更标准的解决方案,但我确实自己找到了另一种解决方案。我不知道这是一个好的解决方案还是仅仅是一个黑客攻击,但我所做的只是将头文件添加到MANIFEST.in。文档并没有真正让人觉得这就是MANIFEST.in文件的目的,但它确实起作用了。我的MANIFEST.in文件现在如下所示:

 home\
     setup.py
     some_python_file.py
     ext\
         __init__.py
         c_file1.c
         c_file2.c
         ext_header.h
Extension('ext.the_extension', ['ext/c_file1.c', 'ext/c_file2.c'])
data_files=[('ext', ['ext/ext_header.h'])]
include ext/ext_header.h

其中包括文件,并在运行
python setup.py install

时成功编译。我认为这可能是正确的路径,但我对正在发生的事情感到有点困惑。include_dir变量不只是告诉编译器在哪里查找头文件吗?这将如何导致我的.h文件进入清单?
include dirs
告诉编译器在哪里查找包含在
中的标准头文件,例如
等。如果安装脚本不想打包自己的头文件,我认为您不应该在Python扩展名中有自定义头文件。@Blagovest Buyukliev:标准头文件和自定义头文件都指向位置-include_dirsI刚刚尝试了这个方法,但无法使其工作,.h文件仍然无法进入清单。它是否假定接收分发的人已经拥有头文件的副本?我真正需要的是将头文件包含在发行版中。@user411133:下面您自己的解决方案可以编辑MANIFEST.in以包含头文件。那不是一个黑客。这就是解决方案。如果您有更多的头文件,“include ext/*.h”也可以工作。请将此(是您自己的答案)标记为解决方案。