生成DLL文件

这里使用的开发工具是Dev C++,详细方法可以查看下面这篇文章:
Dev c++工具将C代码生成dll文件以及如何调用dll文件
需要注意的一点是,64位python解释器只能调用64位的dll文件,因此需要安装64位编译器来编译C代码。

新建DLL项目

点击文件->新建->项目,选择DLL,语言选择C项目,然后选择名称和保存位置。

编写函数代码

新项目会默认生成dllmain.cdll.h两个文件,dll.h中声明了一个函数名,dllmain.c则包含了函数的具体内容,修改函数只需要修改这两个文件中的函数名和函数内容即可,不需要更改其他内容。
修改后,代码中包含了一个名为HelloWorld的函数,功能就是向命令行输出一串文字。

编译导出

在工具栏选择编译器为64位,如果没有则需要自行安装。

点击运行->编译,或者工具栏上的编译按钮,即可生成dll文件。


打开工程所在的文件夹,会发现有一个dll结尾的文件,只需要将这个dll文件复制到需要调用的位置即可。

python调用

使用python自带的ctypes即可调用,调用步骤是

  1. 加载DLL模块
  2. 定义函数参数类型
  3. 定义函数返回值类型
  4. 调用函数
import ctypes
libc= ctypes.cdll.LoadLibrary('sample.dll')#这里的参数是文件路径
#libc.HelloWorld.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例
#libc.HelloWorld.restype=ctypes.c_double #指定函数的返回值类型,此函数没有返回值,仅作示例
libc.HelloWorld() #调用dll内的函数

输出

Hello world from dll!

调用成功。

测试

为了测试效率首先编写一个即简单又耗时的函数,比如求圆周率:
这个方法借鉴了蒙特卡洛方法,不足之处不必深究,仅仅为了测试效率而已。

def getPi()->float:length=10000 #圆半径长circle:int=0 #圆形内的点的数量 retangle=length*length#方形区域面积for x in range(length):for y in range(x):if x*x+y*y<retangle:circle+=1return circle/retangle*8

然后需要在Dev C++中建立DLL项目,在dll.h文件中将DLLIMPORT void HelloWorld();替换为DLLIMPORT double getPi();然后修改dllmain.c文件,更改函数如下:

DLLIMPORT double getPi() {long  length = 10000;long  circle = 0;long  retangle;double   pi;retangle = length * length;for (int x = 0; x < length; x++) {for (int y = 0; y < x; y++) {if (x * x + y * y < retangle) {circle++;}}}pi = (double)circle / retangle * 8.0;//printf_s("Value = %f\n", pi);return pi;
}

编译成dll文件,然后手动复制到python程序所在的目录。

python主程序:

import timedef getPi()->float:length=10000circle:int=0 #圆形内的点的数量 retangle=length*length#方形区域面积for x in range(length):for y in range(x):if x*x+y*y<retangle:circle+=1return circle/retangle*8def getPiC()->float:import ctypeslibc= ctypes.cdll.LoadLibrary('pi2.dll')#libc.getPi.argtypes =[ctypes.c_char_p,ctypes.c_char_p]#指定参数类型,此函数没有参数,仅作示例libc.getPi.restype=ctypes.c_double #指定函数的返回值类型pi2=libc.getPi()return pi2print("Python函数运算:")
start=time.time()
pi1=getPi()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi1}')print("C语言函数运算:")
start=time.time()
pi2=getPiC()
end=time.time()
print(f'运算用时:{end-start}')
print(f'运算结果:{pi2}')

运算结果:

Python函数运算:
运算用时:7.608693599700928
运算结果:3.14170728
C语言函数运算:
运算用时:0.08440113067626953
运算结果:3.14170728

python函数和c函数用时差距明显,python用时7.60秒,而C函数仅用时0.08秒。

python 调用C语言DLL的方法相关推荐

  1. python调用C语言函数(方法)的几种方法

    1. 使用ctypes 可能是Python调用C方法中最简单的一种 2. 使用SWIG 是Python中调用C代码的另一种方法.在这个方法中,开发人员必须编写一个额外的接口文件来作为SWIG的入口. ...

  2. 32位python-64位Python调用32位DLL方法(一)

    摘要: 本文介绍了一种简单快捷的方法,实现在64位Python调用32位DLL. 引言: Python发展到现在,3.x的普及率已经相当高,而且随着硬件(内存的不断增大)以及操作系统(64bit wi ...

  3. Python调用C语言(DLL)

    前言:本文可结合Python调用C++语言(DLL)使用,效果更佳. 采用导出形式:__declspec(dllexport) 功能 无参数,无返回类型 有参数,有返回值 [不需要修改参数数值] 有参 ...

  4. C语言第五篇 python调用C语言写的动态链接库DLL文件

    学习目标:1.学会C语言写windows下的DLL文件.2.用gcc命令将C程序编译成DLL文件.3.学会用python调用C语言写的DLL. 学习内容1:先用C语言写一个简单程序,先建立dll.c文 ...

  5. python调用r语言加载包错误_Python调用R语言

    网络上经常看到有人问数据分析是学习Python好还是R语言好,还有一些争论Python好还是R好的文章.每次看到这样的文章我都会想到李舰和肖凯的<数据科学中的R语言>,书中一直强调,工具不 ...

  6. python调用c语言内核计算,在Linux上实现Python调用C语言函数

    一般思路 Python中内置ctypes库,需调用c编译成的.so文件来实现函数调用. 假设我们所需调用的c文件名为test.c,文件里有我们需要的函数func(x,y). 将.c文件编译成 .so文 ...

  7. python调用c++动态库 linux_linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot ...

  8. Python调用C/C++的种种方法

    Python调用C/C++的种种方法 原文:http://blog.csdn.net/fxjtoday/article/details/6059874 Python是解释性语言, 底层就是用c实现的, ...

  9. 了解火山PC调用易语言DLL

    **大家都知道,一个编程工具最重要的,就能够调用API和其他语言的DLL,今天我们就来详解使用火山PC调用易语言DLL 一.首先我们需要用易语言编写一个DLL文件,如下图:** 二.然后我们新建两个D ...

  10. Python调用JS的四种方法

    Python调用JS的四种方法 1.PyExecJS 方法 1).安装PyExecJS 2). `PyExecJS 示例` 2.PyV8 方法 1).安装PyV8 2). `PyV8 示例` 3.js ...

最新文章

  1. Microbiome:Kraken2进行16S物种注释又快又准
  2. Ubuntu 14.04.1 安装 python mysqldb
  3. MATLAB基本操作(七):有关文件路径的几个函数在编程中的作用
  4. java分页的工具类,java分页工具类
  5. java构造方法 this_Java中的构造方法this、super的用法详解
  6. sox处理mp3_音频处理常用Linux命令总结(一)
  7. linux内核那些事之Sparse vmemmap
  8. 10. Regular Expression Matching[H]正则表达式匹配
  9. Maven项目:Spring Boot版本的办公自动化系统
  10. getchar()细节
  11. 学校面试计算机老师试题及答案,计算机面试问题及答案 (共2篇).doc
  12. 相机外部参数—世界坐标、相机坐标、物体坐标变换
  13. 函数图像生成器 (吉林大学 孙立鑫)
  14. Linux那些让你虎躯一震的命令
  15. 阿里云官方出品:全面总结阿里云云原生架构方法论与实践经验
  16. Python实现“层次分析法”及“自调节层次分析法”
  17. WP采集汇集WP采集插件-WP关键词采集文章
  18. C盘AppData目录文件夹JxBrowser占用90G?
  19. 资料:陀螺仪究竟是怎么工作的?
  20. 定义两个长度相同的整型数组,通过键盘输入给这两个数组赋值。编写程序交换这两个数组对应位置的数值,如数组a[] ={1,2,3,4,5},数组b[] = {6,7,8,9,10}

热门文章

  1. python flask_Python Flask框架详解
  2. gb2312编码在线转换_文件打开乱码?来了解一下文件编码
  3. 未处理sqlexception中value_类 java.sql.SQLException 的使用 (Java Platform SE 6)
  4. python开发wince_零基础学习WinCE开发
  5. c语言半壁江山回调函数,回调函数运行时间太长影响了程序性能,怎么办
  6. SpringBoot:java.lang.NullPointerException
  7. 实战BootStrap:利用BootStrap制作全平台响应式站点
  8. MyBatis学习笔记(2)-MyBatis入门
  9. dedecms关于访问量的修改
  10. C++语法_深度剖析C++中的inline函数