A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

python中调用C/C++一、python中调用c函数((自己运行的)

在C调用Python模块时需要初始化Python解释器,导入模块等,但Python调用C模块却比较简单,下面还是以hello.c 和 hello.py 做一说明:
(1)编写C代码,hello.c代码很简单,只是输出“hello,world”:
    #include<stdio.h>
   int test()
  {
  printf("hello,world");
  }

(2)将编写的C代码编译成动态链接库的形式,具体命令:
gcc hello.c -fPIC -shared -o libhello.so
其中-shared代表这是动态库,-fPIC使得位置独立(如果程序本来就是独立的话会有警告,无视即可),-o指定了输出文件,改成dll后缀一样可以用。

此时在当前目录下就生成了libhello.so 的动态链接库:
(3)在hello.py中导入动态链接库,并调用C函数

这里的ctypes是Python的一个外部库,提供和C语言兼容的数据类型,以方便的调用C编译的静态库和动态库中的函数, 在此可以很肯定的说,ctypes中可定对C的数据类型进行了转换,使用时只需import ctypes ,然后导入动态库即可。
ctypes详细介绍http://www.92to.com/bangong/2016/08-08/9334057.html
import ctypes  
lib = ctypes.cdll.LoadLibrary('./libhello.so')   
lib.test()

(4)在终端下输入Python hello.py, 运行结果:

打印出hello.c中的内容, 说明Python调用C模块成功!
运行过程中出现了OSError: [WinError 193] %1 不是有效的 Win32 应用程序。然后重新安装Python(32位),之前是64位,然后问题就解决了
二、python中调用C++函数(调用动态链接库)必须在原来的C++代码后面添加extern “C”来辅助(C则不需要,这也是与复用C代码时最大的不同点),不然Python在调用这个构建后的动态链接库时是找不到原来的方法或者函数的,说到底还都是因为当前Python的设定中只能调用C函数,而不能直接调用C++的方法。
(1)C++类文件:Test.cpp
(2)将C++代码编译成动态链接库:g++ Test.cpp -fPIC -shared -o libTest.so
(3)Python调用动态库的文件:Test.py



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马