2

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

我可以按照这篇博文编译一个 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文件没有上传到buildsetuptools.setup(). 我寻找了有关如何使用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文件夹中?谢谢!

4

1 回答 1

0

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

使用 cffi 设置源时,您可以为编译器添加目录,如下所示:

from cffi import FFI

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

# ... Rest of your code
"""
于 2021-09-24T10:49:26.027 回答