Cython是结合了Python和C的语法的一种语言,可以简单的认为就是给Python加上了静态类型后的语法。
安装Cython
如果已经安装过Cython可以跳过此步。安装Cython需要使用easy_install,Python 2.7.9 以上的版本已经自带easy_install。在Visual Studio的命令提示符下完成(注意配合Python版本使用32位还是64位的Visual Studio的命令提示符,有可能需要以管理员权限运行):
easy_install -U cython
使用Cython编译
在PyCharm中新建工程,然后新建一个py文件:great_module.py,在该文件中输入如下内容:
def str_add(str1, str2): return int(str1) + int(str2)
这是一个简单的将字符串转换为int求和的函数。为了使该函数能够被Cython编译,需要新建一个run.pyx文件,并加入如下内容:
cdef public int str_add(const char* str1,const char* str2): return int(str1) + int(str2)
这其中的cdef和public等都是cython关键字,这些关键字可以帮助函数可以被外部调用。然后在PyCharm中使用下面的命令编译,生成run.h和run.c两个文件。
cython run.pxy
Cython是支持Python的动态类型特性的,如果后续步骤使用VS的命令行编译也可以生成DLL,但是我在实验时不知为何无法提取到DLL中的函数地址,所以这里统一使用静态类型,所有参数和返回值都使用Cython的静态类型关键字规定好数据类型。
通过VS编译得到动态链接库
在得到了.c和.h文件后,我们需要为其创建一个VS DLL工程。打开VS软件,新建win32项目,其中应用程序类型选择DLL,附加选项选择空项目。 将刚刚的.c和.h文件复制到项目存放代码的文件夹并添加到项目中。在项目中添加一个空的dllmain.cpp,并添加如下代码:
#include <Python.h> #include <Windows.h> #include "run.h" extern "C" { __declspec(dllexport) int __stdcall _str_add(const char * a, const char * b) { return str_add(a, b); } } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: Py_Initialize(); //dll初始化的时候调用,这是python3的写法,python2改成,initrun()。参见生成的run.h PyInit_run(); break; case DLL_PROCESS_DETACH: Py_Finalize(); break; } return TRUE; }
右键项目,属性,进入VC++目录标签页。在包含路径中添加Python的include路径,如“C:\ProgramFiles\Python36\include”。在库目录中添加Python的lib,如“C:\Program Files\Python36\libs”。注意编译的版本选择Release,根据Python版本选择x64平台或x32平台。 编译后即可得到dll文件。
标签:Cython,run,编译,python,dll,Python,int,封装,DLL From: https://blog.csdn.net/hakesashou/article/details/142068254