日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python内置库之学习ctypes库(二)

發布時間:2023/11/28 生活经验 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python内置库之学习ctypes库(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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库(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。