python 调用 C/C++ 编程

来源:互联网 发布:酒神淘宝店地址 编辑:程序博客网 时间:2024/06/06 09:14

~~~~~~~~~~~P1~~~~~~~~~~~~~
首先,先用C写一个简单的函数
Show.c
#include<stdio.h>
void ShowString()
{
printf("Hello World.\n")
}


这个函数是一个最简单的HelloWorld函数,几乎所有编程语言教材都会以她作为第一个例子(跑题了。。。)
我们需要做的是在一个python脚本中调用这个函数
Show.py
#!/usr/bin/env python
import ctypes
DLLs = ctypes.cdll.LoadLibrary
Libs = DLLs("./Show.so")
Libs.ShowString()


首先我们编译Show.c文件
gcc -shared -fPIC Show.c -o Show.so
这样得到一个 .so的文件,注意这个文件的文件名必须和Show.py里调用名字一样。。。
然后在执行python脚本,整个过程如下
jd@jd-desktop:~/163/p1$ gcc -shared -fPIC Show.c -o Show.so
jd@jd-desktop:~/163/p1$ ls -l
总用量 20
-rw-rw-r-- 1 jd jd   84 10月  4 16:55 info.txt
-rw-rw-r-- 1 jd jd  66 10月  4 16:56 Show.c
-rw-rw-r-- 1 jd jd  110 10月  4 16:59 Show.py
-rwxrwxr-x 1 jd jd 8009 10月  4 17:03 Show.so
jd@jd-desktop:~/163/p1$ python Show.py
Hello World.
jd@jd-desktop:~/163/p1$

~~~~~~~~~~~p2~~~~~~~~~~~`
我们可以尝试下稍微复杂的函数
Add.c文件

#include<stdio.h>
int ADD(int X , int Y)
{
return X+Y;
}

Add.py文件

#!/usr/bin/env python
import ctypes
DLLs = ctypes.cdll.LoadLibrary
Libs = DLLs("./Adds.so")
print Libs.ADD(5,4)

Add.c文件是一个简单的加法函数,参数为两个int,函数返回这个个参数之和
和第一部分差不多,首先编译Add.py文件,然后执行python脚本
jd@jd-desktop:~/163/p1/2$ gcc -shared -fPIC Add.c -o Adds.so
jd@jd-desktop:~/163/p1/2$ ls -l
总用量 16
-rw-rw-r-- 1 jd jd   59 10月  4 17:13 Add.c
-rw-rw-r-- 1 jd jd  106 10月  4 17:13 Add.py
-rwxrwxr-x 1 jd jd 7853 10月  4 17:14 Adds.so
jd@jd-desktop:~/163/p1/2$ python Add.py
9
jd@jd-desktop:~/163/p1/2$
~~~~~~~~p3~~~~~~~~
看样子似乎不错,那么我们继续吧
CountArray.c

#include<stdio.h>
void CountArray(int* pt int Len)
{
SUMs = 0
for(int i = 0 ; i < Len ; ++i)
SUMs += *(pt+i)
printf("SUM Is %d.",SUMs)
}

这是一个很普通的求数组和的函数,传入一个int数组的首个元素地址和数组长度,然后球这个数组所有元素的和
于是,按照上面2个部分,我们自然想到了写一个CountArray.py然后编译C的文件,运行python脚本
CountArray.py

#!/usr/bin/env python
import ctypes
DLLs = ctypes.cdll.LoadLibrary
Libs = DLLs("./CountArray.so")
Libs.CountArray(/*手动滑稽*/,10)

python 调用 C/C++ 编程 - 板烧鱿鱼 - 我只是个路人甲,别在意我
 
请允许我使用这样一个表情。。
我想你也看到问题了,对于python来说,他的类型和C有很大不同,如果一个C函数不需要参数,或者参数是python里存在的类型,那在python里直接调用一切OK,但当这个类型python中不存在的时候,你就会发现无法给调用的(C/C++)函数一个合适的参数
对于函数返回值也有同样的问题。。。
0 0
原创粉丝点击