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

IOPaint模型部署教程

IOPaint是一款功能全面且强大的AI图像处理工具,它不仅免费开源,还由SOTA(State-of-the-Art,即最先进)AI模型驱动,为图像编辑和修复带来了前所未有的便利和高效。以下是对IOPaint的详细介绍:

SJJS_1的博客 1543

python包安装——Swig

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

u014689510的博客 7978

Yolov26 在 Rk3588 上的 Rknn Onnx 部署实践(模型转换)

本文详细介绍了将YOLOv26 ONNX模型转换为RKNN模型的过程,适用于RK3588平台。主要内容包括:1)量化数据集的创建,通过随机抽取最多400张JPG图片生成校准数据集;2)ONNX转RKNN的完整脚本,支持多种量化方式和平台适配;3)模型转换的参考调用方式;4)模型结构对比展示。文章还提供了注意事项,强调量化数据集图片尺寸、mean/std值需与实际推理一致,并给出精度优化建议。该转换流程为YOLOv26模型在RK3588上的高效部署提供了完整解决方案。

qq_64366203的博客 1127

LatentSync:开源数字人唇形同步技术的实战部署与优化指南

本文详细介绍了开源数字人唇形同步工具LatentSync的实战部署与优化全流程。从核心原理(潜在扩散模型与TREPA技术)解析,到手把手完成环境搭建、模型获取及首次推理。文章深入探讨了自定义素材处理、关键参数调优(如guidance_scale),并提供了显存不足、人脸检测失败等常见问题的解决方案与性能优化技巧,旨在帮助用户高效部署并提升生成效果。

9o8p7i6u5y的博客 1008

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

ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合

本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。

weixin_29206669的博客 200

Python中的SWIG入门

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

牛肉胡辣汤 1393

LLM评测框架Ragas:测试RAG的性能出现TimeoutError()的解决办法(Ragas+langchain+ollama)

无奈之下,自己找到了一个解决办法,在ragas支持的llm类库中加了一个如下的类,支持ollama、langchian_ollama使用ragas测试报错的问题。可以将如上的库放到你的ragas的系统库的llms目录下,然后修改__init__.py如下。最近用ragas测试rag的性能,发现老出现TimeoutError()的错误。这是一个临时的解决办法,具体等待官方给出最终的解决方案。后来发现官方也没有尽快支持的计划。然后就可以用如下代码进行一些验证。

Criss@陈磊 666

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)

本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1249

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

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

Python开发分享的博客 2460

AUTOSAR-WdgM篇

Wdg通常有两种:一种是芯片内部自带的片内看门狗,另一种是在芯片外部通过SPI这种接口连接的片外看门狗。MCAL只负责常用的有MCU内部看门狗,片内看门狗的特点是Wdg模块是直接访问相关硬件寄存器。内部看门狗依赖于系统时钟片外看门狗属于设备抽象层负责,通常需要使用MCAL提供的其他模块(比如SPI,DIO,PWM等)来访问/控制外扩看门狗芯片。这种不能直接访问硬件寄存器。Wdg Driver:有三种模式slow mode,fast mode ,off mode。

qq_329563867的博客 5830

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

数据分析必问:Pandas面试题及参考答案

DataFrame是Pandas库中的一个核心数据结构,它类似于Excel中的表格,可以存储不同类型的数据。在Pandas中,抽样操作通常很简单,但是需要根据数据的特点和分析的需求来选择合适的抽样方法。数据标准化和归一化是数据预处理中常用的技术,目的是将数据调整到一个合适的范围内,以消除不同特征量纲和数值范围的差异,从而保证模型训练的有效性。CSV文件是一种文本文件,其中的数据以逗号分隔。不平衡数据集指的是数据集中各类别样本的数量差异较大的情况,这可能导致模型训练出现偏差,影响模型的泛化能力。

大模型大数据攻城狮的专栏 3009

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

余额充值