掺杂编程:用 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