python调用c#函数 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 a + b;
}#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使用ctypes调用C编译dll函数方法
在函数声明加入前缀,如
__declspec(dllexport) int Fun(int a, int b)
否则在加载该dll时会提示找不到该符号
在windows下可以通过vs自带的dumpbin工具查看可被调用符号
dumpbin /exports test.dll
C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定
python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件,根据C dll的调用规定不同需要使用不同接口,使用ctypes需要 import ctypes 库
对于简单的C函数,例如 int add(int a, int b) , 此时就可以直接调用了,如
对于较复杂的C函数的参数情况,ctypes调用时对入参和出餐做一定处理,这里分情况讨论
以上包含了几种主要的参数传递情况,ctypes也提供了一个较为完整的python类型和C类型的对照,如下:
怎样让Python脚本与C++程序互相调用
二、Python调用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python调用C动态链接库\x0d\x0a\x0d\x0a Python调用C库比较简单,不经过任何封装打包成so,再使用python的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\x0a printf("you input %d and %d\n", a, b); \x0d\x0a return a+b; \x0d\x0a} \x0d\x0a(2)gcc编译生成动态库libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++编译生成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"来辅助,也就是说还是只能调用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\x0a public: \x0d\x0a void display(); \x0d\x0a void display(int a); \x0d\x0a}; \x0d\x0avoid TestLib::display() { \x0d\x0a cout \x0d\x0ausing namespace std; \x0d\x0aint test() \x0d\x0a{ \x0d\x0a int a = 10, b = 5; \x0d\x0a return a+b; \x0d\x0a} \x0d\x0aint main() \x0d\x0a{ \x0d\x0a cout \x0d\x0a#include \x0d\x0a#include \x0d\x0a \x0d\x0aint fac(int n) \x0d\x0a{ \x0d\x0a if (n
回答于 2022-11-16
python可以包vc程序嘛
Python可以调用VC的模块。
Python调用C++在Python脚本里添加其中ctypes是Python的一个库,提供和C语言兼容的数据类型,可以很方便地调用CDLL中的函数。运行以上脚本得到:显示调用C++程序成功。
采用这个方法,我们不用进行大量的改写,也能在Python中使用我们积累的各种C++程序了。
您可能感兴趣的文章
- 04-02python的全部函数 python全部函数用法
- 04-02python怎么函数作图 python怎么绘制函数图像
- 04-02python输出随机函数 python输出随机字符串
- 04-02python做函数图 python作函数图
- 04-02inc函数python cumprinc函数
- 04-02python命令函数 python 函数
- 04-02包含链式函数定义python的词条
- 04-02python简单函数编程 如何用python编写函数
- 04-02python随机函数种子 python随机数种子怎么用
阅读排行
本栏相关
- 04-02python的全部函数 python全部函数用法
- 04-02python怎么函数作图 python怎么绘制函数
- 04-02python调用c#函数 python调用c函数
- 04-02python输出随机函数 python输出随机字符
- 04-02inc函数python cumprinc函数
- 04-02python做函数图 python作函数图
- 04-02python命令函数 python 函数
- 04-02包含链式函数定义python的词条
- 04-02python随机函数种子 python随机数种子怎
- 04-02python简单函数编程 如何用python编写函
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什