如何为初学者制作Windows的Python扩展

3 投票
5 回答
2244 浏览
提问于 2025-04-15 20:46

我在网上找了很久,想找到一个适合我这个水平的详细指南,教我如何在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 个回答

1

一个好的开始是查看这份文档,内容是关于在Windows上构建C和C++扩展的。

2

Cython(可以理解为经过一些调整和实用性考虑的Pyrex)允许你用同一套代码来制作Python 2和Python 3的模块。这是一个非常不错的选择,特别是当你想为这两个版本制作库的时候。用户指南里有关于如何使用它的说明,但它并没有深入讲解Windows编程、C语言、Python或者编程的一般知识,不过它确实能让一些事情变得简单。

SWIG在遇到问题时可能会比较难处理,而且它不太适合创建一种非常本地化、符合习惯的C语言绑定。为了做到这一点,你可能需要在Python中重新包装这个绑定,这样一来,使用Cython可能会更好一些。SWIG适合那些你没有足够时间去做得很完美的绑定,而且它的好处在于你可以同时将你的API暴露给多种语言。

2

根据你想做的事情,把你的“扩展”简单地做成一个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

撰写回答