Python扩展C/C++库的方法(C转换为Python)

参考网址:https://www.shanlily.cn/archives/330

一、简介

Python是个非常流行的解释型脚本语言。而C是一个非常流行的编译语言。由于其编译的性质,导致C一般比Python要快,但是它是更底层的。相对的,Python编程更加快速和简单。故而将C库作为Python库的扩展极为必要,使得Python既融合了自身的优点,又融合了C语言的优点,正是因为这些性质使得Python越来越流行。

二、通过swing扩展C库

(1) 安装swig

命令: sudo apt-get install swig

(2) 准备好要转换的C源文件和C头文件, 可参考下面的代码:
新建头文件:Conver_Testswig.h,并添加如下内容:

dvoid Table99(int n);
void Fabocci(void);
int Max_value(int value1, int value2);

新建.c文件:Conver_Testswig.c,并添加如下内容:

#include <stdio.h>
#include "Conver_Testswig.h"

// 打印乘法表
void Table99(int n)
{
 int i, j;
 for(i = 1; i <= n; i++)
 {
  for(j = 1; j <= n; j++)
  {
   printf("%d*%d=%-4d", i, j, i*j);
  }
  printf("\n");
 }
}

// 打印斐波那契数列的前20个
void Fabocci(void)
{
 long int f1, f2;
 f1 = f2 = 1;
 int i;
 for(i = 1; i <= 20; i++)
 {
  printf("%12ld %12ld", f1, f2);
  if(i % 2 == 0)
   printf("\n");
  f1 = f1 + f2;
  f2 = f1 + f2;
 }
}

// 返回两个数值中的最大那个。
int Max_value(int value1, int value2)
{
 if(value1 > value2)
 {
  return value1;
 }

 return value2;
}

(3) 创建一个 .i 文件来配置swig。,文件为:Conver_Testswig.i ,并添加如下内容:

%module Conver_Testswig

%{
#define SWIG_FILE_WITH_INIT
#include "Conver_Testswig.h"
%}

void Table99(int n);
void Fabocci(void);
int Max_value(int value1, int value2);

简单介绍:

%module Conver_Testswig 用于配置swig后产生的文件名称
#define SWIG_FILE_WITH_INIT 规定这个C文件将会编译成Python模块
#include "Conver_Testswig.h" 包含头文件

(4) 配置swig。在含有Conver_Testswig.i文件的目录下执行如下命令:

swig -python Conver_Testswig.i

执行该命令会生成一个Conver_Testswig_wrap.c和Conver_Testswig.py文件则代表你配置成功了.

(5) 通过setup库进行编译。新建一个 setup.py 文件并添加内容:

① 编写setup.py文件, 请参考以下代码:

from distutils.core import setup, Extension
MOD = '_Conver_Testswig'

example_module = Extension(MOD, sources=['Conver_Testswig_wrap.c', 'Conver_Testswig.c'], )

setup(name=MOD,ext_modules = [example_module],)

注意: 请务必注意生成目标文件名称需要加”_”

② 通过setup.py文件进行编译

命令: python setup.py build

编译完成后, 可在/build/…/…找到相应库文件,如果是在linux系统下,一般生成的文件中含有.so库文件,将该文件拷贝到pythonsite-packages包管理目录下即可使用或者在build编译后再使用install命令将该.so文件生成在site-packages包管理目录下。此处我的python环境是新建的一个虚拟环境。

命令:python setup.py install


(6) 开始运行测试吧,在pycharm中测试。

打印乘法表:

打印斐波那斐契数列的前20个:

总结

到此这篇关于Python扩展C/C++库的方法(C转换为Python)的文章就介绍到这了,更多相关Python扩展C/C++库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 调用VC++的动态链接库(DLL)

    1. 首先VC++的DLL的导出函数定义成标准C的导出函数: 复制代码 代码如下: #ifdef LRDLLTEST_EXPORTS #define LRDLLTEST_API __declspec(dllexport) #else #define LRDLLTEST_API __declspec(dllimport) #endif extern "C" LRDLLTEST_API int Sum(int a , int b); extern "C" LRDLLTE

  • 使用C++扩展Python的功能详解

    本文主要研究的是使用C++扩展Python的功能的相关问题,具体如下. 环境 VS2005Python2.5.4Windows7(32位) 简介 长话短说,这里说的扩展Python功能与直接用其它语言写一个动态链接库,然后让Python来调用有点不一样(虽然本质是一样的).而是指使用Python本身提供的API,使用C++来对Python进行功能性扩展,可以这样理解,使用更高效的语言实现一些算法计算等等需要更高执行效率的核心(或者需要与系统进行密切交互的)模块,然后让Python像调用内建标准库

  • ubuntu中python调用C/C++方法之动态链接库详解

    安装boost python调用C/C++的方法有很多,本文使用boost.python.考虑到后期有好多在boost上的开发工作,所以boost一并安装了,Boost库分为两个部分来使用,一是直接使用对应的头文件,二是需要编译安装相应的库才可以使用. 具体安装方法可以参考:https://www.jb51.net/article/150380.htm 这里使用: sudo apt-get install libboost-all-dev 服务端 序列化后发送 main.cpp: #includ

  • Python调用C/C++动态链接库的方法详解

    本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef EXPORT_HELLO_DLL #define HELLO_API __declspec(dllexport) #else #define HELLO_API __declspec(dllimport) #endif extern "C" { HELLO_API int IntAdd(in

  • 详解python如何调用C/C++底层库与互相传值

    前言 开发环境: Centos 7 + Python 3.5.1 + Qt Creator(只是使用Qt Creator编译而已,并没有使用QT的任何库) Python调用C/C++库,我现在能做到的有两种方式 1.extern "C" 导出(互相传值比较麻烦,不建议使用这种方式): 将C/C++库做成和平常一样的DLL和或者.so,比如: //.h文件 #include <Python.h> //.cpp文件 //C/C++ my.so 或者my.dll enter &q

  • Python扩展C/C++库的方法(C转换为Python)

    参考网址:https://www.shanlily.cn/archives/330 一.简介 Python是个非常流行的解释型脚本语言.而C是一个非常流行的编译语言.由于其编译的性质,导致C一般比Python要快,但是它是更底层的.相对的,Python编程更加快速和简单.故而将C库作为Python库的扩展极为必要,使得Python既融合了自身的优点,又融合了C语言的优点,正是因为这些性质使得Python越来越流行. 二.通过swing扩展C库 (1) 安装swig 命令: sudo apt-ge

  • linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot framework 通过 SSHLIbrary 库执行远程机器上面的 python 脚本,python 脚本调用 C++ 动态库.所以现在要解决的是如何让python调用c++动态库. python调用c++动态库的两种办法 在上网查资料和咨询同事之后,得到两种办法:第一种将C++动态库封装成C接

  • 利用Python实现Json序列化库的方法步骤

    前言 在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序列化仅支持python内置的基本类型. Python 在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序列化仅支持python内置的基本类型,对

  • Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解

    wheel文件 Wheel和Egg都是python的打包格式,目的是支持不需要编译或制作的安装过程,实际上也是一种压缩文件,将.whl的后缀改为.zip即可可看到压缩包里面的内容.按照官网说法,wheels是发行版Python的新标准并且要取代.egg. Egg格式是由setuptools在2004年引入,而Wheel格式是由PEP427在2012年定义. Wheel现在被认为是Python的二进制包的标准格式. 以下是Wheel和Egg的主要的不同点: Wheel有一个官方的PEP427来定义

  • Windows上配置Emacs来开发Python及用Python扩展Emacs

    Windows下配置Emacs来开发Python 去年在网上偶然的一个机会知道了Emacs的存在,在周围前辈们都在夸赞Sublime好用的时候,喜欢跟大众唱反调的我,突然觉得如果能用Emacs来编代码,也许是个很牛的技能. 但是在看了一次Tutorial后,就因为复杂的快捷键和不同于一般编辑器的操作方式放弃了这个想法. 今年开始工作以后,公司还没有给我发配项目,让我有时间学了些Python入门.在寻找合适的编辑器的时候,搁置脑后许久的Emacs突然被揪了出来. 重新开始打开教程,耐着性子看完,并

  • Python实现修改文件内容的方法分析

    本文实例讲述了Python实现修改文件内容的方法.分享给大家供大家参考,具体如下: 1 替换文件中的一行 1.1 修改原文件 ① 要把文件中的一行Server=192.168.22.22中的IP地址替换掉,因此把整行替换. data = '' with open('zhai.conf', 'r+') as f: for line in f.readlines(): if(line.find('Server') == 0): line = 'Server=%s' % ('192.168.1.1',

  • Python实现远程调用MetaSploit的方法

    本文较为详细的讲述了Python实现远程调用MetaSploit的方法,对Python的学习来说有很好的参考价值.具体实现方法如下: (1)安装Python的msgpack类库,MSF官方文档中的数据序列化标准就是参照msgpack. root@kali:~# apt-get install python-setuptools root@kali:~# easy_install msgpack-python (2)创建createdb_sql.txt: create database msf;

  • C语言字符串转换为Python字符串的方法

    问题 怎样将C中的字符串转换为Python字节或一个字符串对象? 解决方案 C字符串使用一对 char * 和 int 来表示, 你需要决定字符串到底是用一个原始字节字符串还是一个Unicode字符串来表示. 字节对象可以像下面这样使用 Py_BuildValue() 来构建: char *s; /* Pointer to C string data */ int len; /* Length of data */ /* Make a bytes object */ PyObject *obj

  • Vs Code中8个好用的python 扩展插件

    1. Python extension for Visual Studio Code 这个扩展是由微软官方提供的,支持但不仅限于以下功能: 通过Pylint或Flake8支持代码检查 在VS Code编辑器中调试代码 IntelliSense支持自动完成,代码导航和格式化. 支持Jupyter Notebook,Pytest和Unittest 在编辑器中轻松切换Python环境 2.Python Preview 这个插件很牛皮,能够实时可视化你的代码结果. 不仅如此,还能为VSCode切换各种主

  • python图形开发GUI库pyqt5的详细使用方法及各控件的属性与方法

    本文主要列出来python图形开发GUI库pyqt5的窗体,控件属性与方法如果你想看看python图形开发GUI库pyqt5的基础使用方法可以查看我们的另一篇文章 python图形开发GUI库pyqt5的基本使用方法详解 基本框架 import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * class Demo(QWidget): def __init__(self):

随机推荐