当前位置: 首页 > 编程笔记 >

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

施博文
2023-03-14
本文向大家介绍Python扩展C/C++库的方法(C转换为Python),包括了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库文件,将该文件拷贝到python的site-packages包管理目录下即可使用或者在build编译后再使用install命令将该.so文件生成在site-packages包管理目录下。此处我的python环境是新建的一个虚拟环境。

命令:python setup.py install


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

打印乘法表:

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

总结

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

 类似资料:
  • 本文向大家介绍C#中的扩展方法,包括了C#中的扩展方法的使用技巧和注意事项,需要的朋友参考一下 扩展方法是静态方法,就像它们是扩展类型的实例方法一样被调用。使用扩展方法,您可以将方法添加到现有类型中,而无需创建新的派生类型,重新编译或修改原始类型。 以下是我们创建的扩展方法。 让我们看一个使用扩展方法的例子。 示例 输出结果

  • 我试图将Python程序转换为C++,因为我对Python的理解稍微好一点。然而,翻译出来的代码并不起作用。有人能帮我一下吗?我试图用C++制作一个数独板,但它在中返回一些值,而不是其他位置。加上它们是无效的,并包含0。 这个程序的输出是一个二维数组,所有值都不在0,并且对数独板有效: 是一个长度为9的二维数组,在每个位置都有9个列出的语句。在这里,它们都被初始化为。 这个程序的输出也是一个二维数

  • 问题内容: 我正在(自制)基于C的python扩展中进行一些计算量大的模拟。有时我会出错,并想终止模拟。但是,Ctrl- C似乎没有任何作用(除了打印到屏幕上),因此我必须使用或系统监视器终止该进程。 据我所知,python只是等待C扩展完成,并且在这段时间内并没有真正与其通信。 有没有办法使这项工作? 更新 :主要答案(针对我的特定问题)是:1.重写代码以定期将控制权传递回调用方,或2.使用 问

  • 本文向大家介绍C#中的任何扩展方法,包括了C#中的任何扩展方法的使用技巧和注意事项,需要的朋友参考一下 该扩展方法是System.Linq的namepspace的一部分。使用此方法,可以检查是否有任何元素符合特定条件。 首先,设置一个包含元素的数组- 以下是一个示例。它检查数组中的任何元素是否大于或等于20- 这是完整的代码- 示例 输出结果

  • 本文向大家介绍C#中的扩展方法详解,包括了C#中的扩展方法详解的使用技巧和注意事项,需要的朋友参考一下 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释。假设一个控制台程序class Program{}

  • 问题内容: 是否可以将Python程序转换为C / C ++? 我需要实现一些算法,而且我不确定性能差距是否足够大,足以证明我在C / C 中做的所有痛苦(我不擅长)。我考虑过要编写一种简单的算法,并针对这种转换后的解决方案进行基准测试。如果仅此一项比Python版本要快得多,那么除了在C / C 中做到这一点,我别无选择。 问题答案: 是。看看赛顿。它就是这样做的:将Python转换为C以加快速