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.c或example.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

python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!相关推荐

  1. python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python

    Python编程真的那么容易吗?仅仅是看理论就可以学以致用吗? 今天我给你介绍的这本书,也许会让你开始改变这种想法,因为这本书上的练习和案例以及指导本身就足够学好Python了. 清华编程教授强力推荐 ...

  2. python中continue只结束本次循环_循环(while,break,continue),转义字符

    Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 - ...

  3. python 人工智能课程对孩子的好处_少儿编程有什么好处?儿童编程课程学习Python的4大原因...

    儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...

  4. python zope 工作流_使用C语言来扩展Python程序和Zope服务器的教程

    有几个原因使您可能想用 C 扩展 Zope.最可能的是您有一个已能帮您做些事的现成的 C 库,但是您对把它转换成 Python 却不感兴趣.此外,由于 Python 是解释性语言,所以任何被大量调用的 ...

  5. 扇贝编程可以用c语言吗,扇贝编程手机版下载_扇贝编程app下载 v1.1.41 - 87G手游网...

    扇贝编程app是一款实用的编程学习软件,为不同基础的用户制定了不同阶段的学习方案,从入门到应用一应俱全,包括基础课.网络爬虫.数据分析等内容,就算是新手小白也能在扇贝编程很快学会.扇贝编程app拥有丰 ...

  6. python与建筑设计_建筑学是学c语言好还是Python好?

    推荐c#(c#是靠谱语言里最优雅简洁的)微软官方文档,保姆级别教程,真心比python更省心,尤其是ironpython让人摸不着头脑 不要学c.c是面向底层的(操作系统,寄存器,栈等等). 不要先学 ...

  7. python交互式方式、代码文件方式_涨见识了,在终端执行 Python 代码的 6 种方式

    原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...

  8. 用python语言写小程序_小程序用什么语言开发?python语言开发可以开发吗?

    时间: 2020-01-04 20:16:44 本次介绍小程序用什么语言开发?python语言开发可以开发吗?小程序开发语言前端三件套:1.WXML文件2.WXSS文件3.JS文件 小程序是什么?通俗 ...

  9. python几岁开始学比较好_少儿编程到底几岁开始学合适?

    在回答这个问题之前,首先需要明确,学编程到底学的是什么:1. 适用于解决任何问题的"编程思维" (分解思维就是它的核心理念之一) 2. 各种编程语言(Python.C++等) 3. ...

最新文章

  1. php mysql or_mysql条件查询and or使用方法及优先级实例分析
  2. TCP/IP,Http,Socket的区别
  3. 喜讯丨神策数据加入北京信创工委会!
  4. 三十七、细说Scrapy中的settings设置
  5. 记一个mysql分页查询优化试验
  6. CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)
  7. cmd窗口快速定位到具体文件夹方法
  8. [导入]一再的变故,终于决定何去何从.
  9. 进程间通信————有名管道
  10. 开学啦!你还焦躁吗?
  11. Oracle 获取每月最后一天的函数
  12. R语言实现混频数据分析实例----midas回归预测
  13. 容器 10 年,Docker 6 年
  14. 官方实锤!微软宣布以 75 亿美元收购 GitHub
  15. 最新数据库排行出炉,SQL Server 暴跌。。
  16. opencv cv2.copyMakeBorder()函数详解
  17. fiddler注释_fiddler下载_fiddler中文版下载「抓包工具」-太平洋下载中心
  18. python 笔记:h5py
  19. 计算机键盘锁不了怎么办,键盘锁住了怎么解锁?键盘锁死了怎么办?
  20. WinDbg 定位句柄泄漏问题

热门文章

  1. ubuntu16.04配置py-faster-rcnn
  2. Packet Tracer 思科模拟器之交换机配置快速生成树协议(RSTP)
  3. np.c_与np.r_
  4. Expert Shell Scripting
  5. 扒取的国外的后台管理系统的界面
  6. ARM平台YUV转RGB888(转)
  7. HDU 1690 Bus System
  8. 河南彩民中奖3亿5千万
  9. Google推出Web开发利器:App Engine
  10. pandas库Series使用和ix、loc、iloc基础用法