怎样让Python脚本与C程序互相调用二、Python调用C/C\x0d\x0a\x0d\x0a\x0d\x0a1、Python调用C动态链接库\x0d\x0a\x0d\x0aPython调用C库比较简单python调用c函数,不经过任何封装打包成sopython调用c函数,再使用pythonpython调用c函数的ctypes调用即可 。\x0d\x0a(1)C语言文件:pycall.c\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a/***gcc -o libpycall.so -shared -fPIC pycall.c*/\x0d\x0a#include\x0d\x0a#include\x0d\x0aint foo(int a, int b)\x0d\x0a{\x0d\x0aprintf("you input %d and %d\n", a, b);\x0d\x0areturn a b;\x0d\x0a}\x0d\x0a(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c 。使用g编译生成C动态库的代码中的函数或者方法时python调用c函数,需要使用extern "C"来进行编译 。\x0d\x0a(3)Python调用动态库的文件:pycall.py\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0aimport ctypes\x0d\x0all = ctypes.cdll.LoadLibrary\x0d\x0alib = ll("./libpycall.so")\x0d\x0alib.foo(1, 3)\x0d\x0aprint '***finish***'\x0d\x0a(4)运行结果:\x0d\x0a\x0d\x0a\x0d\x0a2、Python调用C(类)动态链接库 \x0d\x0a\x0d\x0a需要extern "C"来辅助python调用c函数,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C方法 。不是用extern "C",构建后的动态链接库没有这些函数的符号表 。\x0d\x0a(1)C类文件:pycallclass.cpp\x0d\x0a\x0d\x0a[html] view plain copy \x0d\x0a#include\x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aclass TestLib\x0d\x0a{\x0d\x0apublic:\x0d\x0avoid display();\x0d\x0avoid display(int a);\x0d\x0a};\x0d\x0avoid TestLib::display() {\x0d\x0acout\x0d\x0ausing namespace std;\x0d\x0aint test()\x0d\x0a{\x0d\x0aint a = 10, b = 5;\x0d\x0areturn a b;\x0d\x0a}\x0d\x0aint main()\x0d\x0a{\x0d\x0acout\x0d\x0a#include\x0d\x0a#include\x0d\x0a\x0d\x0aint fac(int n)\x0d\x0a{\x0d\x0aif (n
回答于 2022-11-16
python使用ctypes调用C编译dll函数方法在函数声明加入前缀,如
__declspec(dllexport) int Fun(int a, int b)
否则在加载该dll时会提示找不到该符号
在windows下可以通过vs自带的dumpbin工具查看可被调用符号
dumpbin /exports test.dll
C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定
【python调用c函数 python调用c函数出现段错误】 python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件 , 根据C dll的调用规定不同需要使用不同接口,使用ctypes需要 import ctypes 库
对于简单的C函数 , 例如 int add(int a, int b),此时就可以直接调用了,如
对于较复杂的C函数的参数情况,ctypes调用时对入参和出餐做一定处理 , 这里分情况讨论
以上包含了几种主要的参数传递情况,ctypes也提供了一个较为完整的python类型和C类型的对照,如下:
python 怎么调用c语言接口ctypes:可直接调用c语言动态链接库 。
使用步骤:
1 编译好自己的动态连接库
2 利用ctypes载入动态连接库
3 用ctype调用C函数接口时,需要将python变量类型做转换后才能作为函数参数,转换原则见下图:
4 Python若想获取ctypes调用的C函数返回值,需要先指定返回值类型 。我们将在接下来的完整Sample中看到如何使用 。
#Step 1:test.c#include stdio.h
int add(int a, int b)
{
return ab;
}#Step 2: 编译动态链接库 ( 如何编译动态链接库在本文不详解,网上资料一大堆 。)gcc -fPIC -shared test.c -o libtest.so
#Step 3:test.py
from ctypes import *mylib = CDLL("libtest.so")或者cdll.LoadLibrary("libtest.so")add = mylib.add
add.argtypes = [c_int, c_int] # 参数类型 , 两个int(c_int是ctypes类型,见上表)
add.restype = c_int # 返回值类型 , int (c_int 是ctypes类型,见上表)
sum = add(3, 6)
python调用c函数的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于python调用c函数出现段错误、python调用c函数的信息别忘了在本站进行查找喔 。
推荐阅读
- mysql服务器卸载,mysql55卸载
- redis地理距离,redis gps
- erp系统的组合商品怎么做,erp中的综合费用包括什么
- 惠玩公众号怎么样,惠玩手游平台官网
- oracle据库如何备份 oracle数据库如何备份数据表
- c语言输入和输出16进制,c语言输出十六进制数
- 包含京城游戏棋牌的词条
- 教唱歌技巧直播间在线直播,主播教唱歌
- 云mysql怎么搭建 mysql 云