python c 混合编程 用c循环_混合编程:用 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.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 大法吧!相关推荐
- python编程第四版_清华编程教授强力推荐《Python编程》,指导你如何学习python
Python编程真的那么容易吗?仅仅是看理论就可以学以致用吗? 今天我给你介绍的这本书,也许会让你开始改变这种想法,因为这本书上的练习和案例以及指导本身就足够学好Python了. 清华编程教授强力推荐 ...
- python中continue只结束本次循环_循环(while,break,continue),转义字符
Apple iPhone 11 (A2223) 128GB 黑色 移动联通电信4G手机 双卡双待 4999元包邮 去购买 > 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 - ...
- python 人工智能课程对孩子的好处_少儿编程有什么好处?儿童编程课程学习Python的4大原因...
儿童编程Python是什么课程? Python是强制用一种面向对象的解释型计算机程序设计语言,它是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public Li ...
- python zope 工作流_使用C语言来扩展Python程序和Zope服务器的教程
有几个原因使您可能想用 C 扩展 Zope.最可能的是您有一个已能帮您做些事的现成的 C 库,但是您对把它转换成 Python 却不感兴趣.此外,由于 Python 是解释性语言,所以任何被大量调用的 ...
- 扇贝编程可以用c语言吗,扇贝编程手机版下载_扇贝编程app下载 v1.1.41 - 87G手游网...
扇贝编程app是一款实用的编程学习软件,为不同基础的用户制定了不同阶段的学习方案,从入门到应用一应俱全,包括基础课.网络爬虫.数据分析等内容,就算是新手小白也能在扇贝编程很快学会.扇贝编程app拥有丰 ...
- python与建筑设计_建筑学是学c语言好还是Python好?
推荐c#(c#是靠谱语言里最优雅简洁的)微软官方文档,保姆级别教程,真心比python更省心,尤其是ironpython让人摸不着头脑 不要学c.c是面向底层的(操作系统,寄存器,栈等等). 不要先学 ...
- python交互式方式、代码文件方式_涨见识了,在终端执行 Python 代码的 6 种方式
原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...
- 用python语言写小程序_小程序用什么语言开发?python语言开发可以开发吗?
时间: 2020-01-04 20:16:44 本次介绍小程序用什么语言开发?python语言开发可以开发吗?小程序开发语言前端三件套:1.WXML文件2.WXSS文件3.JS文件 小程序是什么?通俗 ...
- python几岁开始学比较好_少儿编程到底几岁开始学合适?
在回答这个问题之前,首先需要明确,学编程到底学的是什么:1. 适用于解决任何问题的"编程思维" (分解思维就是它的核心理念之一) 2. 各种编程语言(Python.C++等) 3. ...
最新文章
- php mysql or_mysql条件查询and or使用方法及优先级实例分析
- TCP/IP,Http,Socket的区别
- 喜讯丨神策数据加入北京信创工委会!
- 三十七、细说Scrapy中的settings设置
- 记一个mysql分页查询优化试验
- CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)
- cmd窗口快速定位到具体文件夹方法
- [导入]一再的变故,终于决定何去何从.
- 进程间通信————有名管道
- 开学啦!你还焦躁吗?
- Oracle 获取每月最后一天的函数
- R语言实现混频数据分析实例----midas回归预测
- 容器 10 年,Docker 6 年
- 官方实锤!微软宣布以 75 亿美元收购 GitHub
- 最新数据库排行出炉,SQL Server 暴跌。。
- opencv cv2.copyMakeBorder()函数详解
- fiddler注释_fiddler下载_fiddler中文版下载「抓包工具」-太平洋下载中心
- python 笔记:h5py
- 计算机键盘锁不了怎么办,键盘锁住了怎么解锁?键盘锁死了怎么办?
- WinDbg 定位句柄泄漏问题