相关疑难解决方法(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 ctypes:如何释放内存?获得无效指针错误

我想从带有ctypes的C/C++库中获取一些字符串到python中.我的代码看起来像这样:

lib中的代码:

const char* get(struct something *x) 
{
    [...]
    // buf is a stringstream
   return strdup(buf.str().c_str());
}

void freeme(char *ptr)
{
    free(ptr);
}
Run Code Online (Sandbox Code Playgroud)

Python代码:

fillprototype(lib.get, c_char_p, POINTER(some_model)])
fillprototype(lib.freeme, None, [c_char_p])

// what i want to do here: get a string into python so that i can work
// with it and release the memory in the lib.
c_str = lib.get(some_model)
y = ''.join(c_str)
lib.freeme(c_str) 
Run Code Online (Sandbox Code Playgroud)

如果我打印()c_str,一切都在那里.问题是(或似乎是)在最后一个Python行中.我无法释放内存 - 库得到错误的指针.我在这做错了什么?(请不要建议使用boost :: python等).

*** glibc detected *** python2: munmap_chunk(): invalid pointer: 0x00000000026443fc ***
Run Code Online (Sandbox Code Playgroud)

c c++ python ctypes

16
推荐指数
1
解决办法
8831
查看次数

标签 统计

c ×2

ctypes ×2

python ×2

c++ ×1

cython ×1