Ubuntu16.04中python调用C++
系统版本:Ubuntu16.04
python调用C++动态链接库
需要extern "C"来辅助,也就是说还是只能调用C函数,不能直接调用方法,但是能解析C++方法。
c++文件:pycallclass.cpp
#include <iostream>
using namespace std;
class TestLib
{
public:
int display();
void display(int a);
void display2();
};
int TestLib::display()
{
cout<<"First display"<<endl;
return 0;
}
void TestLib::display(int a)
{
cout<<"Second display:"<<a<<endl;
display();
display2();
}
void TestLib::display2()
{
cout<<"display2:"<<endl;
}
extern "C" {
TestLib obj;
int display() {
obj.display();
}
void display_int(int a) {
obj.display(a);
}
}
python文件;pycallclass.py
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
编译生成动态库so
需要python直接调用的需要extern声明,间接调用的可以不声明
python调用C++可执行程序
c++文件:main.cpp
#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;
}
python文件:main.py
import subprocess # 以前是commands,现在更新成了subprocess
import os
main = "./testmain"
if os.path.exists(main):
rc, out = subprocess.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)
输入命令
g++ -o testmain main.cpp
把main.cpp 编译为testmain二进制可执行文件