Python 和 C语言的相互调用
第一种、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> intfoo(inta, intb) {  printf("you input %d and %d\n", a, b);  returna+b; } | 
pycall.py
| 1 2 3 4 5 | importctypes 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> usingnamespacestd;  classTestLib {   public:     voiddisplay();     voiddisplay(inta); }; voidTestLib::display() {   cout<<"First display"<<endl; }  voidTestLib::display(inta) {   cout<<"Second display:"<<a<<endl; } extern"C"{   TestLib obj;   voiddisplay() {     obj.display();     }   voiddisplay_int() {     obj.display(2);     } } | 
pycallclass.py
| 1 2 3 4 5 6 7 | importctypes 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> usingnamespacestd; inttest() {   inta = 10, b = 5;   returna+b; } intmain() {   cout<<"---begin---"<<endl;   intnum = 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 | importcommands importos main ="./testmain"ifos.path.exists(main):   rc, out =commands.getstatusoutput(main)   print'rc = %d, \nout = %s'%(rc, out)  print'*'*10f =os.popen(main)  data =f.readlines()  f.close()  printdata  print'*'*10os.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

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号