第一种、Python调用C动态链接库(利用ctypes)
下面示例在linux或unix下可行。
pycall.c
1 2 3 4 5 6 7 8 |
/***gcc -o libpycall.so -shared -fPIC pycall.c*/
#include <stdio.h>
#include <stdlib.h>
int foo( int a, int b)
{
printf ( "you input %d and %d\n" , a, b);
return a+b;
}
|
pycall.py
1 2 3 4 5 |
import ctypes
ll = ctypes.cdll.LoadLibrary
lib = ll( "./libpycall.so" )
lib.foo( 1 , 3 )
print '***finish***'
|
运行方法:
gcc -o libpycall.so -shared -fPIC pycall.c
python pycall.py
第2种、Python调用C++(类)动态链接库(利用ctypes)
pycallclass.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream>
using namespace std;
class TestLib
{
public :
void display();
void display( int a);
};
void TestLib::display() {
cout<< "First display" <<endl;
}
void TestLib::display( int a) {
cout<< "Second display:" <<a<<endl;
}
extern "C" {
TestLib obj;
void display() {
obj.display();
}
void display_int() {
obj.display(2);
}
}
|
pycallclass.py
1 2 3 4 5 6 7 |
import ctypes
so = ctypes.cdll.LoadLibrary
lib = so( "./libpycallclass.so" )
print 'display()'
lib.display()
print 'display(100)'
lib.display_int( 100 )
|
运行方法:
g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp
python pycallclass.py
第3种、Python调用C和C++可执行程序
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <iostream>
using namespace std;
int test()
{
int a = 10, b = 5;
return a+b;
}
int main()
{
cout<< "---begin---" <<endl;
int num = test();
cout<< "num=" <<num<<endl;
cout<< "---end---" <<endl;
}
|
main.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import commands
import os
main = "./testmain"
if os.path.exists(main):
rc, out = commands.getstatusoutput(main)
print 'rc = %d, \nout = %s' % (rc, out)
print '*' * 10
f = os.popen(main)
data = f.readlines()
f.close()
print data
print '*' * 10
os.system(main)
|
运行方法(只有这种不是生成.so然后让python文件来调用):
g++ -o testmain main.cpp
python main.py
疑问:
Windows 如何实现?
REF
https://www.jb51.net/article/165362.htm
https://www.cnblogs.com/si-lei/p/10748612.html
https://www.cnblogs.com/fyly/p/11266308.html