【问题标题】:Python setup script extensions, how do you include a .h file?Python 设置脚本扩展,如何包含 .h 文件?
【发布时间】:2011-05-14 15:16:15
【问题描述】:

所以我有一个看起来像这样的目录:

 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 能够正确构建它?

【问题讨论】:

    标签: python c installation setup.py


    【解决方案1】:

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

    include ext/ext_header.h
    

    当我运行python setup.py install时,其中包含文件并成功编译

    【讨论】:

    • 如果你有更多的头文件 'include ext/*.h' 也可以。请将此(是您自己的答案)标记为解决方案。
    【解决方案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”提供包含文件。

    为什么这对你不起作用?

    【讨论】:

    • 我认为这可能是正确的道路,但我对发生的事情有点困惑。 include_dir 变量不只是告诉编译器在哪里寻找头文件吗?这将如何导致我的 .h 文件进入清单?
    • include dirs 告诉编译器在哪里查找包含在<> 中的标准头文件,例如<stdio.h><stdlib.h> 等。如果安装脚本不需要要打包自己的头文件,我认为您不应该在 Python 扩展中包含自定义头文件。
    • @Blagovest Buyukliev:标准头文件和自定义头文件都指向位置 - include_dirs
    • 我刚刚尝试过,但无法让它工作,.h 文件仍然无法进入清单。它是否假设接收分发的人已经拥有头文件的副本?我真正需要的是将头文件包含在发行版中。
    • @user411133:您自己在下面编辑 MANIFEST.in 以包含标题的解决方案应该可以工作。这不是黑客攻击。这是解决方案。
    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多