swig-python-之初

从头安装gdal库(Linux环境下的Python版) 大多数情况下都是可以直接pip wheel安装成功的,但有些特殊情况下(比如一个容器内)需要从头配置gdal库。我“有幸”亲自体验了一把,整个过程** “痛并快乐着” **。整个过程查了很多资料,中间也遇到了很多问题,部分在网上没有找到相关答案,整个过程全网也没有一个类似的教程,因此记录一下留给有需要的程序猿/程序媛。整个思路就是风来将挡、水来土掩。首先安装GDAL,不出意外的话会报错,需要安装PROJ6。 阅读详情

1. SWIG介绍(来自于wiki)

SWIG (Simplified Wrapper and Interface Generator) is anopen source software tool used to connect computer programs or libraries written in C or C++ with scripting languages such as Lua, Perl, PHP, Python, R, Ruby, Tcl, and other languages likeC#, Java, Go, Modula-3,OCaml, Octave, and Scheme. Output can also be in the form of XML or Lisp S-expressions.

2.SWIG的安装

2.1 下载地址: http://www.swig.org/download.html

2.2 将下载的文件如swig-2.0.8.tar.gz解压

2.3 进入swig-2.0.8目录,执行一下命令

./configure --prefix=/usr/program/swig/ #或者其他安装目录
make
make install
在./configure 时遇到Cannot find pcre-config script from PCRE (Perl Compatible Regular Expressions)的错误,使用

./configure --prefix=/usr/progam/swig --without-pcre, 因为我使用swig的目的是python

3.SWIG的使用

SWIG支持多种语言(脚本),这里介绍python的一个例子,这个例子是使用c语言模拟位数组,然后交由python扩展

最后有一个使用c扩展python和直接使用python的效率比较

1. 编写c文件

//Bit.h
#ifndef BIT_H
#define BIT_H

//create: 2012-10-19
//version: 1.0
#define CHAR_LENGTH sizeof(unsigned char) 

//Bit模拟位操作
typedef struct
{
    unsigned char *pArray;//指向一个字符型数组,用以存储bit位
    unsigned long length;//记录pArray的长度, 字符个数
    unsigned long used;//记录用户使用的bit位
}Bit;

//创建Bit对象
//@len: 初始化bit位数
//@return: 返回一个指向Bit对象的指针, 该指针需要使用freeBit销毁
Bit* createBit(unsigned long len);

//设置bit位
//@pb:指向Bit的一个对象, 如果为NULL, 返回1
//@index: 需要设置的bit位, 范围应当是 (0~used)
//@value: bit位的值, (0,1)
//@return: 成功返回0, 如果出现pb==NULL, index out of range, value!=0 and value!=1, 返回1
int setBit(Bit *pb,unsigned long index, int value);

//获取bit位
//@pb:指向Bit的一个对象, 如果为NULL, 返回1
//@index: 需要设置的bit位, 范围应当是 (0~used)
//@return: 成功返回0, 如果出现pb==NULL, index out of range, 返回1
int getBit(Bit *pb,unsigned long index);

//返回使用的长度
//@pb: 如果pb==NULL, return -1
int bitLength(Bit *pb);

//销毁Bit对象
void freeBit(Bit *pb);
#endif
//Bit.c
#include "Bit.h"
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

//创建Bit对象
//@len: 初始化bit位数, len>=0
//@return: 返回一个指向Bit对象的指针, 该指针需要使用freeBit销毁
Bit* createBit(unsigned long len)
{
    if(len<0)
        return NULL;

    Bit *pb=(Bit*)malloc(sizeof(Bit));
    if(len>0)
    {
        pb->length=(len-1)/CHAR_LENGTH+1;
        pb->pArray=(char*)malloc(sizeof(char)*pb->length);
        pb->used=len;
    }else
    {
        pb->length=0;
        pb->pArray=NULL;
        pb->used=len;
    }
    return pb;
}

//设置bit位
//@pb:指向Bit的一个对象, 如果为NULL, 返回1
//@index: 需要设置的bit位, 范围应当是 [0~used)
//@value: bit位的值, (0,1)
//@return: 成功返回0, 如果出现pb==NULL, index out of range, value!=0 and value!=1, 返回1
int setBit(Bit *pb,unsigned long index, int value)
{
    if(pb==NULL || pb->pArray==NULL || index<0 || index>=pb->used || (value!=0 && value!=1))
        return 1;

    unsigned long a=index/CHAR_LENGTH;
    unsigned long b=index%CHAR_LENGTH;
    if(value==0)
    {
        pb->pArray[a]&=(UCHAR_MAX^(1<<b));
        //printf("%d\n",pb->pArray[a]);
    }else
    {
        pb->pArray[a]|=(1<<b);
        //printf("%d\n",pb->pArray[a]);
    }
    return 0;
}

//获取bit位
//@pb:指向Bit的一个对象, 如果为NULL, 返回1
//@index: 需要设置的bit位, 范围应当是 [0~used)
//@return: 成功返回0, 如果出现pb==NULL, index out of range, 返回1
int getBit(Bit *pb,unsigned long index)
{
    if(pb==NULL || pb->pArray==NULL || index<0 || index>=pb->used)
        return 1;
    unsigned long a=index/CHAR_LENGTH;
    unsigned long b=index%CHAR_LENGTH;
    //printf("%d\n",pb->pArray[a]&(1<<b));
    if((pb->pArray[a]&(1<<b))==0)
        return 0;
    else
        return 1;
}

//返回使用的长度
//@pb: 如果pb==NULL, return -1
int bitLength(Bit *pb)
{
    if(pb==NULL || pb->pArray==NULL)
        return -1;
    return pb->used;
}

//销毁Bit对象
void freeBit(Bit *pb)
{
    if(pb==NULL)
        return;
    if(pb->pArray!=NULL)
    {
        free(pb->pArray);
        pb->pArray=NULL;
    }
    free(pb);
}

2. 编写SWIG使用的swg文件

//Bit.i

%module Bit #module name
%{
#include "Bit.h" #加入Bit_wrap.c文件
%}

#需要导出到python的函数
extern Bit* createBit(unsigned long len);
extern int setBit(Bit *pb,unsigned long index, int value);
extern int getBit(Bit *pb,unsigned long index);
extern int bitLength(Bit *pb);
extern void freeBit(Bit *pb);

3. 编译

3.1 使用Bit.i生成wrap文件,该命令得到Bit_wrap.c Bit.py

[username]$ swig -python Bit.i
3.2 编译Bit.c Bit_wrap.c文件,其中PYTHON_INCLUDE为python安装目录下的include文件夹, 如/usr/program/python/include/python.2.7username]$ gcc -c

[username]$ gcc -c -fpic Bit.c Bit_wrap.c -I${PYTHON_INCLUDE}
3.3 连接得到动态库

[username]$ gcc -shared Bit.o Bit_wrap.o -o _Bit.so
注意输出库文件为_Bit.so, 有下划线和模块名称组成
4.使用,这里以计算一亿一下的素数个数来演示

将Bit.py和_Bit.so文件复制到需要的位置

编写prime_count.py

#coding=utf-8
#create-2012-10-17
#version: 1.0
#计算小于1亿的素数个数

import time
from Bit  import *

MAX=100000000
count=1

#0 表示素数
#1 表示已经去除

start_time=time.time()

len=MAX/2-1
b=createBit(len)

def remove(idx):
    i=idx
    global b
    while i<len:
        #b[i]=1
        setBit(b,i,1)
        i+=2*idx+3

for i in range(3,MAX,2):
    if getBit(b,(i-3)/2)==0:
        #素数
        count+=1
        remove((i-3)/2)

end_time=time.time()
print count
print end_time-start_time
使用方法和其他python提供的模块一样

5.附计算结果

使用以上方法(c扩展python)得到结果为:

5761455(素数个数)
113.465720892(second)
另外,如果直接使用python模拟bit,并同样计算一亿一下的素数个数,结果为

5761455(素数个数)
293.473055124(second)
可以看到,性能提升非常明显(接近3倍),当然这只是一个例子,并不具有太多代表性

另附,同样的方法,如果是c语言,调用我们实现的Bit的话结果为:

5761455(素数个数)
5(second)

计算这种事情还是交给c做比较恰当

关于更多素数计算的信息见我的博客-数的计算


你的反馈就是博主进步的最大动力

使用Swig转C++为Python详解 Swig是一个可以使得不同语言之间可以相互调用的工具,今天记录一下使用Swig将C++转为Python的方法。 首先从官网下载Swig,官网网址www.swig.org,下载后解压压缩包,并将swig.exe的路径添加到环境变量path中,就可以使用swig了。 下面我们来准备C++代码。创建一个空项目,并创建.h文件与.cpp文件,编写代码: #pragma once #include... 阅读详情

相关推荐

c++ python 交互之 swig

工作中准备用python 作为脚本语言来实现一些工作于是就研究 可以和c++ 交互的脚本语言 本来一开始用的lua 但是 lua本身API接口很少 要么自己需要重复封装代码 要么c++ 导出 太多地方需要重复造轮子。之所以选择python 是因为python的包多 直接 import 即可食用 好了 废话不多说直接进入正题 swig 是什么? SWIG 是一种软件开发工具,将用 C 编写的程序...

c98136202zig的博客 887

swig Cannot find pcre-config script from PCRE

运行configure的时候,指定pcre的路径         ./configure --with-pcre-prefix=/usr/lib64 如果没有pcre,则先安装pcre 安装后,可以用locate pcre来查找pcre安装在哪

mlzhu007的专栏 4948

Python调用C/C++(使用SWIG)

这里选用SWIG的一个重要原因是,它不仅可以用于Python,也可以用于其他语言。如今SWIG已经支持C/C++的好基友Java,主流脚本语言Python、Perl、Ruby、PHP、JavaScript、tcl、Lua,还有Go、C#,以及R。

virusnono的专栏 3385

swig的安装

1.下载 http://www.swig.org/download.html 2.解压后在window编译执行,使用cygdrive ./configure --prefix=/usr/program/swig/ #或者其他安装目录 make make install在./configure 时遇到Cannot find pcre-config script from PCRE

慢慢长大--铭镛 1万+

【SWIG】C程序到python模块的swig转换流程

C程序到python模块的转换流程 程序参考:http://www.swig.org/Doc3.0/SWIGDocumentation.html#Introduction_nn4 1、编辑待转C程序 example.c /* File : example.c */ double My_variable = 3.0; /* Compute factorial of n */ int fact(int n) { if (n <= 1) return 1; else

zhuhua造轮子的博客 667

在Win7环境下,利用SWIG实现Python调用C的方法

1.系统环境 (1)操作系统为Win7 x64; (2)VS版本为VS2013_RTM_ULT_CHS,并安装了更新Visual Studio 2013 Update 4 RTM; (3)Python版本为python-3.4.2 x64; (4)SWIG版本为swigwin-3.0.5; (5)编辑软件pycharm-professional-4.0.1。2.安装SWIG (1)下载并

cuiqiang1990优快云的博客 4358

linux学习笔记——swig

参考链接:linux 安装swig下载地址:https://sourceforge.net/projects/swig/files/swig/tar xvf swig-4.0.2.tar.gzcd swig-4.0.2./configuremakesudo make install输入:swig -version 查看是否安装成功错误: ./configure时出现错误 Cannot find pcre-config script from PCRE (Perl Compatible Regular Exp

phily123的博客 1494

swig安装--python学习笔记

注:这个只是我从自己的草稿箱里整理出来的,系菜鸟。 写这个笔记的背景是我想学习怎么可以让python调用opencv里的函数。 据说是可以自己写wrap的,但是swig是一个很方便的工具。    SWIG是一个能将C或者C++编写的程序与其它各种高级语言如Perl, Python, Ruby, 和 Tcl进行联接的开发工具。      其原理是从C/C++头文件中找到申

积微致著 1万+

swig-python

1. SWIG介绍(来自于wiki) SWIG (Simplified Wrapper and Interface Generator) is anopen source software tool used to connectcomputer programs or libraries written in C or C++ with scripting languages 

Lce的专栏 989

利用 SWIG 对 C++ 库进行 Python 包装

功能目的:用c++写一个功能,然后用swig将c++写得功能封装成一个python库,然后在python中可以直接import 调用。 1.安装 swig sudo apt-get install swig 输入:swig -version查看是否安装成功,成功会出现: SWIG Version 3.0.12 Compiled with g++ [x86_64-pc-linux-gnu] C...

boss的博客 1208

windows下用swig实现python调用C\C++的方法

windows下用swig实现python调用C\C++的方法本文技术平台:win7,vs2010,python2.7(64位)1.下载swig在[www.swig.org]官网上下载相应的安装包,下载后解压安装包到任意路径,注意:路径中最好不要带空格。这样swig便可以使用2.c++源文件和swig接口文件,文件如下:example.h/* example.h */ #ifndef EXAMPLE

perfectmanman的博客 2183

SWIG学习记录(一)SWIG基础

SWIG 基础

Sailor431的博客 7148

gephi生成网络关系图_路网拓扑重建专题 (3) 网络图生成

城市道路网建模在获得基础路网之后,需要考虑道路交通网络的描述与表达问题。网络是将现实世界中的事物及其关系进行适当的抽象,构造成由节点和边按照一定规则组成的形式。一个实体网络可以由有限个“节点”集合与“边”集合构成的图表示,即网络表示为。对于一个由个节点组成的无权复杂网络,该图有邻接矩阵,这里。根据研究对象不同,建模方法主要包括原始法[1]和对偶法[2]两种,见图1,字母a-j为交叉口编号...

weixin_39761195的博客 3504

python包安装——Swig

1、什么是swig SWIG 是一个非常优秀的开源工具,支持您将 C/C++ 代码与任何主流脚本语言相集成。此外,它向更广泛的受众公开了基本代码,改善了可测试性,让您的 Ruby 代码库某部分能快速写出高性能的 C/C++ 模块。 2、SWIG安装 到官网下载swigwin文件包,解压到一个文件夹中; 解压的文件夹中有个swig.exe文件,把该文件的路径添加到系统路径Pa

u014689510的博客 7978

可变形卷积(Deformable Conv)原理解析与torch代码实现

图6为可变形卷积示意图。图1所示为普通卷积在输入特征图上进行卷积计算的过程,卷积核大小为3*3,在输入特征图尺寸为7*7上进行卷积,将卷积核权重与输入特征图对应位置元素相乘并求和得到输出特征图元素,按一定方式滑动窗口就能计算得到整张输出特征图。图6所示,在input feature map上普通卷积操作对应卷积采样区域是一个卷积核大小的正方形(绿框),而可变形卷积对应的卷积采样区域为一些蓝框表示的点,这就是可变形卷积与普通卷积的区别。先来一张图感受一下,图3为标准卷积与可变形卷积的卷积示例。

panghuzhenbang的博客 5万+

量子密钥分发系统的设计与实现(二):光路子系统初步讨论

本文主要对量子密钥分发系统中的光路子系统方案进行了讨论。

量子领域相关话题 2407

swig 将c++转换为python 接口

  为了能将scanlib和python代码无缝连接,我们需要通过python来调用scanlib的接口。   一、 利用swig将scanlib的c++版转换为python 版 1.1 swig 的说明以及安装 SWIG(Simplified Wrapper and Interface Generator)是一个为C/C++库提供脚本调用支持的工具,简单的来说就是将c/c++包装成其他...

jishuqianjin的博客 1万+

自动驾驶车辆纵向控制实战:基于CARLA与ROS2的PID算法实现

本文详细介绍了基于CARLA与ROS2的自动驾驶车辆纵向控制实战,重点讲解了PID算法的实现与应用。通过搭建仿真环境、实现定速巡航和自适应巡航功能,帮助开发者掌握自动驾驶核心技术。文章还分享了系统集成、仿真验证及常见问题的调试技巧,为自动驾驶开发提供实用指导。

weixin_33728708的博客 355

Python中的SWIG入门

SWIG (Simplified Wrapper and Interface Generator,简化封装和接口生成器) 是一个开源工具,用于将C/C++代码转换为各种高级编程语言的接口代码。它允许开发人员在Python等脚本语言中直接使用底层的C/C++代码,以提高开发效率和灵活性。

牛肉胡辣汤 1393

【YOLOv11工业级实战】22. YOLOv11动态蛇形卷积破解弯曲裂纹检测难题(附2小时部署代码)

摘要:本文聚焦工业场景中弯曲裂纹检测的核心痛点,针对风电叶片、织物纱线等曲线缺陷传统检测漏检率高的问题,提出基于动态蛇形卷积(DSC)的YOLOv11优化方案。因企业数据保密,采用AITEX织物缺陷库(含曲线纱线断裂标签)结合Blender物理仿真生成2000张弯曲裂纹数据,实现从数据准备到部署的全流程实操。通过将DSC模块插入YOLOv11 Neck层,弯曲裂纹召回率从68.1%提升至89.4%,mAP@0.5达83.7%,推理速度3.1ms(2080Ti)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1153

Challenge 4 - OSCP A

在c盘下发现一个windows.old,在里面可以找到SYSTEM和SAM文件,下载到本地,利用samdump2解密发现没解出来,再来试试pwdump.py(https://github.com/CiscoCXSecurity/creddump7)得到压缩包密码bludecode,解压之后发现一个比较特殊的文件configuration.php,里面有两个类似密码的字符串。登录之后在/opt/backups/下发现几个特殊文件,其中sitebackup3.zip是个正常的压缩包。但是这个压缩包是有密码的。

羽的博客 5787

​利用SWIG将C++库转为Python

swig 将c++转换为python 接口_jishuqianjin的博客-优快云博客

Python开发分享的博客 2460

Far planner 部署真实小车 & 树莓派部署lego_loam

今天开一贴Far planner的部署,也算是lego loam的部署吧 因为state_estimation用的是lego loam小车底盘: 轮趣的mini差速底盘外加多一层钢板,中间层用来放velodyne的电池(小的电池还没到,大的电池塞不进去目前)和velodyne信号盒子。前面还可以加一个相机。底层用来放小车的电池和马达等设备了,底层不用动。最上面一层用来安装velodyne16线雷达,需要额外钻孔(如果买轮趣的话可以找老板钻个孔?我也不确定,我自己钻的)。 雷达固定螺丝用的是 1/4-20*3

博客 4303

使用SWIG来扩展Python

一、在Windows上安装SWIG: 1.下载swigwin :http://www.swig.org/download.html (是swigwin不是swig,不然要自己手动搞swig.exe) 2.解压缩包swigwin-3.0.12.zip 至指定目录 (这里假设是D:\swig) 3.配置环境变量(假设python的安装目录为E:\python): 新建PYTHON_INC

困兽的博客 7089

手把手写深度学习(27):如果获得相机位姿态的plücker embedding?以RealEstate10K为例

用plücker embedding表示相机的位姿是一种非常常用的方法,这篇博客以RealEstate10K数据集为例子,详细讲解如何从相机的轨迹坐标中获得plücker embedding,用于下一步模型的学习。

沉迷单车的追风少年 2239

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python数组 swig_python中SWIG

Swig通过解析C头文件并自动创建扩展代码来操作。 要使用它,你先要有一个C头文件。例如,我们示例的头文件如下:/* sample.h */#include extern int gcd(int, int);extern int in_mandel(double x0, double y0, int n);extern int divide(int a, int b, int *remainder...

weixin_32475629的博客 518

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: hadoop配置(个人总结)
下一篇: gcc编译动态链接库
king_on
博客等级 码龄17年 8粉丝 32原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值