背景
前几天要用Python实现一个小玩具代码,可是实现了一半实在是被Python超级可怕的低性能吓到了,几个简单的重复性的底层工作用Python来做的话整个东西就基本没有什么可用性了,所以就想到了使用C、C++来完成底层的工作,再把高层的工作交给Python来完成。
上网去查发现了很多在Python中使用C、C++代码的方法,一开始是想用Cython来着(毕竟慕名已久),可是实现了来着,但是总感觉有点太麻烦乱,因为我其实只是想用一个C++写的函数就可以了,Python只是调一下这个C的函数而已,其他的东西我都用不到。这种情况下Cython感觉还是有点麻烦,把C和Python语法混在一起又感觉不大舒服,就想着换一个更轻量的方法。下面就是我最终使用的方法。
使用的环境
- Python3
- Windows10
- MinGW64(gcc的Windows版)
(如果有些时候离不开Windows的很多常用工具,又很喜欢Linux上面一行g++/gcc编译C++/C代码的快感,强烈建议在Windows上安装MinGW,安装方法网上的方法很多)
简单Demo
- 实现C代码(hello.cpp)
#include<iostream>
using namespace std;
extern "C"{ //看别人解释为什么要这一行,是说这样编译完函数名不会变
void sayhello(){
cout<<"Hello world!"<<endl;
}
}
- 编译C代码(Linux上直接把hello.dll改成hello.so即可)
g++ hello.cpp -shared -o hello.dll -fPIC
- 编写Python代码(test.py)
import ctypes
dll = ctypes.CDLL('hello.dll') //将自己写的dll(Windows)或so(Linux)文件加进来
def main():
dll.sayhello() //要调哪个函数直接这样写就行
if __name__=='__main__':
main()
上面的函数调用传参也是可以的,很方便的,直接扔也行,如果担心传参出错,比如ctypes.c_ulonglong(para)这样既可,详情可以百度ctypes
- 运行
python test.py
-
运行截图