混编程:用 C 语言来扩充 Python 大法吧!

Python
实在是同一种于人上瘾的编程语言,简洁的语法+丰富的恢弘包,几乎可以为此
Python 做另外业务,唯一的私点似乎便是「慢」,但是和飞跃之编译语言
C\C++
互联以后,可以解决脚本语言运行速度迟滞的题目,甚至用来做一些计密集型的工作,比如
CFD。
当即同样篇介绍纯 C 语言扩展 Python。

为什么是swig?

Python底层就是 C\C++,有原生的 C\C++
接口,用来传递变量,但是完全手写中间层对于自身如此的脱产 Coder
实在太痛苦了,这不是平宗很有趣的劳作。事实上,即使在Python的法定文档里吗推荐用第三正在的接口工具处理。

Third party tools like Cython, cffi, SWIG and Numba offer both
simpler and more sophisticated approaches to creating C and
C++ extensions for Python.

除外以上的老三在工具外,还有
sip,Boost.python,pyrex相当好用的工具,在当下首
文章
里初步介绍了 C\C++ 扩展Python的各种方法。
之前用了Boost.python,可能是自我前未曾点了Boost吧,不是死爱,感觉不够轻量级,然后对swig相同展现钟情的由来是彼对纯
C 的脍炙人口支持(当时写这篇文章的时候对 C++
莫名的反感
,虽然现在一度入了 C++ 的坑了)。

怎设置swig?

1.Mac OS
强烈建议用brew来装

brew install swig

一致长达命令搞定,妈妈还为非用担心您的乘问题了。

2.Windows
博主小退出windows开发条件一会儿,建议参考合法文档

3.Linux
名的apt-get install

怎么使用swig?

自身参考了官方文档里之一个示范程序,最终的目的是老成一个动态链接库和一个供调用之py文件。

  • 宣示函数先
    始建一个example.h头文件来声称是函数:

/*File: example.h*/
int fact(int n);
  • 概念函数
    开创一个example.c的文本(用来计算 n!):

/* File: example.c */
#include "example.h"
int fact(int n) {
    if (n < 0){
   /* This should probably return an error, but this is simpler */
        return 0; }
    else  if (n == 0) {
            return 1;
                    }
    else {
            /* testing for overflow would be a good idea here */
            return n * fact(n-1);
          }
 }
  • 首要一步
    咱们尚用创造一个example.i文件来部署swig

/* File: example.i */
%module example

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

int fact(int n);

大概解释一下这个布局文件,#define SWIG_FILE_WITH_INIT宏规定这个 C
文件拿见面叫编译成 Python 模块,#include "example.h"
给起待包含的头文件,最后一句子以example.i声明了这个函数,就是这么简单嘛。
产生了当下三只文件之后,我们用先编译出一个 Python 文件,在终极运行:

swig -python example.i

设编译的凡C++文件,需要丰富-C++选项:

swig -c++ -python example.i

运作了这令后,在干活目录里会出现example_wrap.cexample.cxx暨一个example.py的Python文件,但是现在之模块还非克一直调用,因为还少动态链接库,如果强行调用会出现这种不当:

ImportError: No module named '_example'

对接下去要编译出一个shared object
file,在Linux平台里是so文件,在windows下是Dll文件,有零星栽方法成功这个手续,官方文档中引进下distutils,即Python的setup.py扭转模块:

"""
    setup.py file for SWIG example
"""
from distutils.core import setup, Extension

example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
setup(name = 'example',
    version = '0.1',
    author = "SWIG Docs",
    description = """Simple swig example from docs""",
    ext_modules = [example_module],
    py_modules = ["example"],
    )

接下来以终点里输入:

python setup.py build_ext --inplace

build_ext语Python需要编译的是扩张模块,--inplace会面管编译生成的文书在当前目录中。
运行了这令后,会以劳作目录出现一个so文件,这时example.py文本可以一直叫Python调用:

10! = 362880

来自 Cescfangs
的博客:fangs.in