如何为初学者制作Windows的Python扩展
我在网上找了很久,想找到一个适合我这个水平的详细指南,教我如何在Windows上扩展Python,但一直没找到。
假设你有一些这样的C代码:
#include <stdio.h>
#include <math.h>
double valuex(float value, double rate, double timex)
{
float value;
double rate, timex;
return value / (double) pow ((1 + rate), (timex));
}
你想把它变成一个可以在Windows(如果有区别的话,是64位系统)上使用的Python 3模块。你该怎么做呢?我查过SWIG和Pyrex,但这两个工具似乎都是为Unix用户准备的。而且我不确定Pyrex是否支持Python 3。
我只是想学习编程的基础知识,使用一些实际的例子。
最后,如果有人能推荐一本好的书,教我如何扩展Python,我会非常感激。
谢谢。
5 个回答
一个好的开始是查看这份文档,内容是关于在Windows上构建C和C++扩展的。
Cython(可以理解为经过一些调整和实用性考虑的Pyrex)允许你用同一套代码来制作Python 2和Python 3的模块。这是一个非常不错的选择,特别是当你想为这两个版本制作库的时候。用户指南里有关于如何使用它的说明,但它并没有深入讲解Windows编程、C语言、Python或者编程的一般知识,不过它确实能让一些事情变得简单。
SWIG在遇到问题时可能会比较难处理,而且它不太适合创建一种非常本地化、符合习惯的C语言绑定。为了做到这一点,你可能需要在Python中重新包装这个绑定,这样一来,使用Cython可能会更好一些。SWIG适合那些你没有足够时间去做得很完美的绑定,而且它的好处在于你可以同时将你的API暴露给多种语言。
根据你想做的事情,把你的“扩展”简单地做成一个DLL文件,然后用ctypes来访问,这可能是最简单的方法。
我用你的代码,稍微调整了一下,保存为mydll.c
:
#include <stdio.h>
#include <math.h>
#define DLL_EXPORT __declspec(dllexport)
DLL_EXPORT double valuex(float value, double rate, double timex)
{
float value;
double rate, timex;
return value / (double) pow ((1 + rate), (timex));
}
我下载了Tiny C Compiler,然后用这个命令来运行它。
tcc -shared mydll.c
(我认为加上-rdynamic
可以避免在你的函数定义中到处添加DLL_EXPORT。)
这样就生成了mydll.dll
。然后我运行了Python:
Python 3.1.2 (r312:79149, Mar 21 2010, 00:41:52) ... on win32
>>> from ctypes import *
>>> mydll = cdll.mydll
>>> valuex = mydll.valuex
>>> valuex.argtypes = [c_float, c_double, c_double]
>>> valuex.restype = c_double
>>> valuex(1.2, 2.3, 3.4)
2.0470634033800796e-21