ctypes库踩坑日记2

  • 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰
  • 二.生成dll文件
  • 三.ctypes库调用

一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰

1.下载MinGW-w64
#下载地址https://sourceforge.net/projects/mingw-w64/

如果安装的是32位的gcc,默认编译的dll文件为32位的
如果安装的是64位的gcc,默认编译的dll文件为64位的(建议安装64位的)

安装的时候
Version选择当前支持的最高版本。

Architecture:由于我的是win10 64位,因此选择了x86_64。如果是32位电脑,需要选择i686。
Threads:这个世界上只有两种操作系统,符合 posix 协议的,和 Windows 。如果你想要开发 Windows 程序,需要选择 win32 ,
而开发 Linux、Unix、Mac OS 等其他操作系统下的程序,则需要选择 posix 。我只开发在 Windows 下运行的程序,所以选择了 win32 。
Exception:异常处理在开发中非常重要,你在开发的过程中,大部分的时间会耗在处理各种异常情况上。如果你之前选择了 64位,则这里有两个异常处理模型供你选择,
seh 是新发明的,而 sjlj 则是古老的。
seh 性能比较好,但不支持 32位。
sjlj 稳定性好,支持 32位。 我这里选择了 sjlj。
如果之前架构选择的是i686,则选项是 dwarf 和 sjlj 两种异常处理模型。同样的,dwarf 的性能要优于 sjlj ,他们都不支持 64位 。
Build revision:使用默认值。

在MinGW-w64/bin目录下运行cmd黑窗
常用gcc命令
#查看gcc版本信息
gcc -v

#生成64位的dll文件
gcc --shared -o test64.dll test.c

#生成32位的dll文件
gcc --shared -o test.dll test.c -m32

#生成可执行文件(.exe文件)
gcc test.c -o test

-shared: 表明产生共享库
-o:指定生成可执行文件的名称
-m32:生成32位的文件

最好配置到环境变量,方便后期使用

二.生成dll文件

新建test.c文件
添加以下内容

#include <stdio.h>int max(int num1, int num2);int main()
{/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0;
}
int max(int num1, int num2)
{/* 局部变量声明 */int result;if (num1 > num2)result = num1;elseresult = num2;return result;
}

使用命令gcc --shared -o test64.dll test.c
gcc --shared -o test.dll test.c -m32
生成32位的dll和64位的dll文件

三.ctypes库调用

用ctypes库去调用dll文件

import ctypes
import timedll=ctypes.WinDLL('./test.dll')
while True:res = dll.main()res1= dll.max(ctypes.c_int(2),ctypes.c_int(2))print("res", res)print("res1",res1)time.sleep(1)

用python64位解释器调用32位的dll文件报以下错误:
#[WinError 193] %1 不是有效的 Win32 应用程序!

应该调64位的dll文件才不会有报错

import ctypes
import timedll=ctypes.WinDLL('./test64.dll')
while True:res = dll.main()res1= dll.max(ctypes.c_int(2),ctypes.c_int(2))print("res", res)print("res1",res1)time.sleep(1)

python内置库之学习ctypes库(二)相关推荐

  1. python内置库之学习ctypes库(一)

    ctypes库踩坑日记1 1.引言(这里是讲的windows下调用的方式) 2.结构体 3.联合体(共用体) 和上面结构体用法类似,只不过这里继承的是`Union`类 4.进阶用法 5.接受返回的值 ...

  2. python内置库之学习ctypes库(三)--调用Win32API

    ctypes库踩坑日记3 1.调用win32的api 2.最好让结构体和程序分开 3.取完数据找到对应信息,创建code.py 4.创建main.py,代码这样看着就很简洁 1.调用win32的api ...

  3. python内置函数open_Python学习教程:Python内置函数大总结(下篇)

    这里接着上次的 Python学习教程,给大家总结了Python 剩下的33个内置函数. 31 hash() 返回对象的哈希值 In [112]: hash(xiaoming)Out[112]: 613 ...

  4. python 内置函数 builtins_python学习笔记(七)——内置函数

    builtins.py模块,是python的内建模块,在运行时会自动导入该模块.在该模块中定义了很多我们常用的内置函数,比如print,input 等. 在 builtins.py 模块中给出如下注释 ...

  5. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

    Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...

  6. python内置函数系列之set(一)(持续更新)

    python内置函数系列之set(一)(持续更新) 查看python中set介绍(ctrl + 鼠标左键): 有如下介绍: """set() -> new empt ...

  7. python内置库之学习configparser库(一)

    python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...

  8. python内置标准库不可以处理的文件是_精华 | 140种Python标准库、第三方库和外部工具都有了...

    原标题:精华 | 140种Python标准库.第三方库和外部工具都有了 作者 | 宋天龙 来源 | 大数据(ID:hzdashuju) [导读]Python数据工具箱涵盖从数据源到数据可视化的完整流程 ...

  9. random输出1到10之间_第43P,随机数,Python内置库之random

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第43篇文章,第二阶段的课程:Python基础知识:Python内置库之random随机库. 学习本课程,建议先看一遍:[计算机基础 ...

最新文章

  1. Oracle重建所有表和索引
  2. mysql数据放在什么位置,mysql数据存放的位置在哪
  3. Heritrix 3.1.0 源码解析(八)
  4. Kubernetes Pod入门指南
  5. php 检测 变量是否设置,php如何判断变量是否有设置的函数
  6. python模块大全doc_Python doc8包_程序模块 - PyPI - Python中文网
  7. windows 安装jenkins
  8. 游戏筑基开发之单链表及其增删改查(C语言)
  9. mysql远程连接error 1045_启用远程MySQL连接:错误1045(28000):用户被拒绝访问
  10. Java算法常见面试题及答案
  11. 一周信创舆情观察(12.7~12.13)
  12. Windows系统遇到不能打开要写入的文件怎么办?----重启电脑即可
  13. cad插入块_怎么才能将两张CAD图纸合并为一张?
  14. 阿弥陀佛么么哒 - 笔记
  15. iOS -- 开源项目和库
  16. 文件批量改名-bat操作
  17. 成功解决 -- flink.shaded.guava18.NumberFormatException: Not a version
  18. python开头声明中文_python开头——文件声明 详解
  19. 斯坦福大学开放课程:编程方法.02/第二课练习:karel 跳墙
  20. 写代码,心情很重要。一定要保持一个良好的心态,静下心来

热门文章

  1. linux环境下nacos的安装+启动,阿里云服务器安装nacos
  2. 2022-2028年中国分散式风电行业投资分析及前景预测报告
  3. 程序连接不上mysql数据库文件_数据库问题(程序连接mysql错误)
  4. xgboost重要参数2为主但不全要参照1
  5. 字符串编辑距离(Edit Distance)
  6. LeetCode简单题之位1的个数
  7. 华为+长安研发芯片?长安蔚来更名“阿维塔科技”
  8. 优化汽车仪表板以实现高效渲染
  9. ADAS车辆在行人安全方面得分很低
  10. 2021年大数据Spark(十六):Spark Core的RDD算子练习