【问题标题】:Building Python-C Extension using CFFI, but Setuptools does not include custom header files in build使用 CFFI 构建 Python-C 扩展,但 Setuptools 在构建中不包含自定义头文件
【发布时间】:2019-11-18 11:52:51
【问题描述】:

我正在尝试使用 Python 中的 CFFI 包为现有的 C 代码创建 Python 接口。

我可以按照this blog post 编译一个C 库。现在我想让这个 python 库可用,而不需要对 sys.path 进行任何花哨的更新。

我发现也许通过 Python 的 setuptools setup() 函数创建一个发行版可以实现这一点,我主要是通过创建一个 setup.py 文件来实现它

import os
import sys

from setuptools import setup, find_packages

os.chdir(os.path.dirname(sys.argv[0]) or ".")

setup(
    name="SobelFilterTest",
    version="0.1",
    description="An example project using Python's CFFI",
    packages=find_packages(),
    install_requires=["cffi>=1.0.0"],
    setup_requires=["cffi>=1.0.0"],
    cffi_modules=[
        "./src/build_sobel.py:ffi",
        "./src/build_file_operations.py:ffi",
    ],
)

,但我遇到了这个错误

build/temp.linux-x86_64-3.5/_sobel.c:492:19: fatal error: sobel.h: No such file or directory

据我所知,问题在于sobel.h 文件没有上传到setuptools.setup() 创建的build 文件夹中。我寻找了一些建议,包括使用Extensions() 和编写MANIFEST.in 文件,并且似乎都为正确的头文件添加了相对路径:

MANIFEST.in
setup.py
SobelFilterTest.egg-info/PKG-INFO
SobelFilterTest.egg-info/SOURCES.txt
SobelFilterTest.egg-info/dependency_links.txt
SobelFilterTest.egg-info/requires.txt
SobelFilterTest.egg-info/top_level.txt
src/file_operations.h
src/macros.h
src/sobel.h

但我仍然收到相同的错误消息。是否有正确的方法将头文件添加到build 文件夹?谢谢!

【问题讨论】:

  • 您可以使用CFLAGS env var 来调整包含路径,例如CFLAGS="-I$(pwd)/src/" python setup.py build_ext
  • 哇,我被这个问题困扰了好几天,非常感谢。有没有办法给评论点赞?
  • 很高兴我能帮上忙!我想当您获得更多声誉时,您将能够为 cmets 投票;但是,无论如何,支持 cmets 对 IMO 毫无用处,所以我不会打扰。

标签: python makefile setuptools python-cffi cffi


【解决方案1】:

实际上不是 pip 缺少.h 文件,而是编译器(如gcc)。因此,这不是将丢失的文件添加到设置中,而是确保 cffi 可以找到它。一种方法(如 cmets 中提到的)是通过环境变量使其对编译器可用,但还有另一种方法。

使用 cffi 设置源代码时,您可以像这样为编译器添加目录:

from cffi import FFI

ffibuilder = FFI()
ffibuilder.set_source("<YOUR SOURCE HERE>", include_dirs=["./src"])

# ... Rest of your code
"""

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2017-05-01
    • 1970-01-01
    • 2018-08-17
    • 2018-12-07
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多