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

锐浪报表 Grid++Report 子报表 Delphi

锐浪报表 Grid++Report 是国内较好的报表控件,本人一直使用它,做出很多特色的报表。可以说你的报表设计出来,它基本上能做出来。 但是它帮助文件上,说的不深,近期因为要做一个有关社工的报表,大表中,嵌套2个子表。可以说,一个表到三个数据集,分别打印。 在认真看了帮助的基础上,网上探索,基本无此类,特别是Delphi的帮助,几乎为零。经二天摸索,做出来了。 一、设计思路 1、大表和二个小表,可以设计为三个表,分别使用三个GridppReport控件,取名...

lyhoo163的专栏 9075

python包安装——Swig

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

u014689510的博客 7978

STM32巡线小车PID调参实战:从五路灰度传感器数据到稳定运行的避坑指南

本文详细介绍了STM32巡线小车的PID调参实战,从五路灰度传感器数据处理到PID参数优化,提供了系统化的调试方法和常见问题解决方案。通过加权平均法计算偏移量,逐步调整比例、积分、微分参数,实现小车稳定巡线。文章还涵盖了定时器配置、控制周期优化及高级调试技巧,帮助开发者避开常见陷阱,提升巡线性能。

weixin_42570484的博客 193

VS2022打包C#安装包(最新、最全)

VS2022打包C#安装包(最新、最全)

qq_37959253的博客 9908

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万+

汽车IVI中控开发入门及进阶(三):概述

开发板的作用当然是为了解决一些应用而设计的,主体是板,终极目的是应用,中间过程则是开发,是基于板的开发。可以和编译Linux内核一样,通过buildroot配置,menuconfig修改,编译出一个完整的可以直接烧写到芯片上运行的Linux系统软件(包含boot、kernel、rootfs以及rootfs中的各种库和应用程序)。所以这些实现都是建构在汽车中控开发板的解决方案上的,最核心的当然就是一颗中控主控芯片,这是一颗国产中控双核DA主控芯片,AECQ100认证的车规级芯片。Q:uboot的作用是什么?

码农17年的博客 1407

Python中的SWIG入门

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

牛肉胡辣汤 1393

微信小程序视频内容服务类目审核不过?绕过审核的两种思路!

虽然不推荐绕过官方审核,但在实际项目中,总有一些特殊情况:比如,最近开发的小程序涉及视频播放,提交审核时,被官方要求补充“教育服务 - 在线视频课程”类目。但我们的内容只是车辆使用介绍,并非教育课程,无法提供相应资质。该怎么办?很多开发者发现,小程序开发不是最难的,审核才是最难的。 微信为了规避法律风险,要求某些功能必须提供资质。例如:然而,并不是所有公司都能轻松申请到这些资质,甚至有些资质根本不适用于我们的业务,导致审核卡住,无法上线。就像我遇到的这个问题,官方要求我们补充“在线视频课程”类目,但实际业务

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3248

指纹浏览器 WebGPU:新一代图形指纹的检测趋势与提前防御

指纹浏览器与风控系统对抗已升级至硬件层面。传统基于WebGL的API拦截和像素噪声技术,在WebGPU时代因架构变革而失效。WebGPU通过Compute Shader直接测量GPU物理算力,暴露了软件模拟的致命缺陷。防御需转向真实GPU硬件直通和虚拟化技术,如vGPU分割算力并伪装特征,以应对风控系统对硬件拓扑和浮点精度的检测。唯有基于物理算力的拟态,才能抵御新一代图形指纹的降维打击。

数据知道的博客 219

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

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

Python开发分享的博客 2460

[Research Tips] 我的zotero文献管理方案: 云端同步+iPad批注+overleaf笔记

文献管理一直是一个很头疼的事. 最初直接在paper上做笔记, 后来尝试各种各样的文献管理软件, 比如endnote, mendeley等, 再后来直接用excel. 每一种方案都不是很满意. 最近尝试了各种软件, 摸索出一个合适自己的文献管理方案, 分享给大家. 我的需求: 支持PDF内全文搜索. 支持笔记搜索. 支持同步 可以批注PDF. 支持word内引用 支持Tex笔记语法 支持标签化管理 目前的方案除了第二个需求, 其他的都支持. 就目前我的经验来说, 除了知网研学可以搜索笔记外, 其他软件都

落日之城 5317

使用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

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2465

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: 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、付费专栏及课程。

余额充值