pb调用Python封装dll

Python028

pb调用Python封装dll,第1张

Cython将Python文件转为c文件。

在调用DLL之前,最好先建立另一个空项目将pch.cpp里面的代码复制过去测试一下直接调用listAdd函数能不能成功。

新建空项目,将生成dll和lib文件以及原Python文件test_numpy.py复制到新项目的路径下,新建main.cpp,用于调用dll,运行之前,需要配置一下项目属性,将之前生成的lib文件加入到链接器里面,再运行程序。

这里来给大家演示一下,函数的定义或构造,并调用函数来实现封装后的效果。

首先我们来看看想实现下面的这个效果,如果不使用函数应该怎么实现。

以上两种返回结果都是1-9这几个数字。

以上两种方法,第一种代码重复率太高,代码美观效果太差,虽然能实现效果,但是因为数量比较少,还能手工打出来这几行代码,如果是打印1-100000就很难实现了。这时候for循环还是可以实现的,但是for循环只能实现类似的数字和变量循环,无法进行复杂的功能开发。鉴于此,函数这个概念就被python引入了,下面先来看看函数是怎么实现上面的效果的,还是两种方法。

这时候如果想实现上面的打印结果就直接使用函数名+小括号调用函数就可以了,这种类型的语法,不仅可以反复使用,而且封装后的代码更美观。

二、Python调用C/C++\x0d\x0a\x0d\x0a\x0d\x0a1、Python调用C动态链接库\x0d\x0a\x0d\x0aPython调用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\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