# Python 有哪些黑魔法？

ctypes ，当年有个人靠这个省了好几个月的加班

------------------------劳动节补充-----------------------------

回答

@于酥酥

1. ipython + ctypes: 调试/测试Linux API的交互式运行环境

ipython是最好的REPL！（我喜欢Python，至少有30%的好感来自ipython）

REPL的好处不言自明，在开发和调试时能大大的提高效率。尤其是需要对API进行快速验证时。

我最早是用gdb来做一些REPL的事情，但毕竟操作复杂，交互式功能有限。而用ctypes，就爽快多了，ctypes可以直接人so中提取出函数，在Python层面稍加包装，就能直接使用，不用编译/连接，保持运行状态，结果出来直接用Python分析……简直是画面太美

真实场景：

我们的运营环境有数十万host，host上去除了编译环境，某一天，我们对某个系统调用的返回产生怀疑。于是，按照通常的作法，在开发机上写一个示例程序，编译，拷贝到运营机，运行，反复执行这一个过程。

那么有了ctypes，直接在python/ipython的REPL里调试就好了。还不容易留下可疑的可执行程序。

2. ctypes作为胶水

ctypes增强了python作为胶水语言的能力，从进程调用/统一协议级别的脱水直接深入到二进制级别的脱水。这样看来，C++对C的兼容就显得没那么重要了

真实场景：

某个执行框架，插件以so的形式提供，so提供固定的函数入口。重构时打算去除语言耦合，改用进程调用的方式调用插件（类似于cgi server，这样可以减少对插件编写的限制，插件本身也更容易测试，防止so崩溃造成框架整体崩溃）。但是很多插件的作者已离职，于是只需要框架额外增加从so里调用函数出来即可，做到平滑升级。

3. ctypes与系统编程

ctypes作为一种轻量并且内置的c语言“代理”，使得python极大地增强了系统编程的能力。

从此，系统编程的代码也可以变得更加优雅。

真实场景：

sdn/vpc方案需要对内核协议栈做较多的调整，从管理的层面上，网络配置由中央控制并下发。因此，host上存在一个daemon，一方面要接受zookeeper的配置变更通知，另一方面要把配置解析后通过netlink与内核通信。

这个daemon大概几乎没有人会用python去做。但是我看到iotop里用到ctypes对netlink接口的封装，惊为天人，并且python更加适合对配置解析与处理。我斗胆用python实现了这个daemon，调试起来如丝般顺滑，然后就减少了好几个月的加班。


回答我成电师兄

@韦易笑
大神

没有有生产环境用过cffi，以前在自己电脑上简单用过，感觉不如ctypes简单粗暴。当然我没去用的主要原因还是不想在部署的时候附带太多东西。
