相关疑难解决方法(0)

用Python包装C库:C,Cython还是ctypes?

我想从Python应用程序中调用C库.我不想包装整个API,只包含与我的案例相关的函数和数据类型.在我看来,我有三个选择:

  1. 在C中创建一个实际的扩展模块.可能是矫枉过正,我也想避免学习扩展写作的开销.
  2. 使用Cython将C库中的相关部分公开给Python.
  3. 在Python中完成所有工作,使用ctypes与外部库进行通信.

我不确定2)或3)是否是更好的选择.3)的优点是它ctypes是标准库的一部分,结果代码将是纯Python - 尽管我不确定这个优势实际上有多大.

两种选择都有更多优点/缺点吗?你推荐哪种方法?


编辑:感谢您的所有答案,他们为希望做类似事情的人提供了一个很好的资源.当然,这个决定仍然是针对单个案例做出的 - 没有人"这是正确的事情"的答案.对于我自己的情况,我可能会选择ctypes,但我也期待在其他项目中尝试Cython.

由于没有一个真正的答案,接受一个有点武断; 我选择了FogleBird的答案,因为它提供了对ctypes的一些很好的洞察力,它目前也是最高投票的答案.但是,我建议阅读所有答案以获得良好的概述.

再次感谢.

c python ctypes cython

272
推荐指数
11
解决办法
7万
查看次数

为 Python 包安装纯 C 库

我有一个 Python 包 (3.7),我在其中制作了一个模块,该模块使用 C 库来解决性能问题。该 C 库通过 Ctypes 连接。现在,我有一个 Makefile 将 C 库编译为 .so(在 Windows 中使用 Cygwin minGW),但是,为了能够更轻松地共享包,我希望在安装时使用该库(setup.py ),这样编译器/make 就不必单独安装等。

但是,我无法找到用于 distutils 或类似方法来编译 C 库(不是 Python 扩展,纯 C)的工作方法。我最接近工作解决方案的是:https : //stackoverflow.com/a/34830639/9863065

当按照上述链接进行操作时,.pyd 编译时没有错误,但是,当使用 Ctypes 加载文件时,我在尝试访问 C 库中定义的函数时收到 AttributeErrors。

编辑:我做了这个最小的、可重复的例子:https : //github.com/mkielg11/ctypes_distribution

使用上面的示例时,我得到以下信息:

C:\...\ctypes_distribution>python setup.py build
running build
running build_py
running build_ext
building 'xclib' extension
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\bin\HostX86\x64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Ixpackage/deps/xclib/include/ -IC:\Anaconda3\include -IC:\Anaconda3\include "-IC:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.26.28801\include" "-IC:\Program Files (x86)\Windows Kits\10\include\10.0.18362.0\ucrt" …
Run Code Online (Sandbox Code Playgroud)

python ctypes distutils python-3.x python-packaging

7
推荐指数
0
解决办法
357
查看次数

在Windows中构建Python C扩展时导出符号时出错

我正在努力将Python模块移植到Windows.我有一个玩具示例如下.

文件夹结构是:

foo/
  libfoo/
    foo.c
  setup.py
Run Code Online (Sandbox Code Playgroud)

setup.py

from setuptools import setup, Extension

sources = ['libfoo/foo.c']

foo = Extension('libfoo',
                 sources = sources,
                 define_macros = None,
                 include_dirs = ['./libfoo'],
                 libraries = None,
                 library_dirs = None,
                 )

setup(name          = 'foo',
      ext_modules      = [foo],
      install_requires = ['setuptools'],
)
Run Code Online (Sandbox Code Playgroud)

libfoo/foo.c(完整性)

#include <stdio.h>

void foo() {
  printf("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

当我尝试安装包时,遇到错误.

C:\Users\user\foo>python setup.py install
running install
running bdist_egg
running egg_info
creating foo.egg-info
writing requirements to foo.egg-info\requires.txt
writing foo.egg-info\PKG-INFO
writing top-level names to foo.egg-info\top_level.txt
writing dependency_links to …
Run Code Online (Sandbox Code Playgroud)

python windows linker setuptools python-extensions

2
推荐指数
1
解决办法
1167
查看次数