如何为绝对的初学者制作适用于Windows的Python扩展

时间:2010-03-23 20:21:18

标签: python windows python-3.x

我一直在寻找互联网,试图找到一个很好的分步指南来扩展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));
}

并且您希望将其转换为Python 3模块,以便在Windows(64位,如果这会产生影响)系统上使用。你会怎么做呢?我查了一下SWIG和Pyrex,在这两种情况下他们似乎都面向unix用户。使用Pyrex我不确定它是否适用于Python 3。

我只是尝试使用一些实际的例子来学习编程的基础知识。

最后,如果有一本好书可以推荐学习扩展,我会非常感激。

谢谢。

5 个答案:

答案 0 :(得分:2)

Cython(具有一些扭结的Pyrex以及为实用性做出的决定)可以使用一个代码库来制作Python 2和Python 3模块。这是为2和3创建库的一个非常好的选择。user guide解释了如何使用它,但它没有揭开Windows编程或C或Python或一般编程的神秘面纱,认为它可以为你简化一些事情

当你遇到问题时,SWIG可能很难处理,并且不会特别有助于创建一个你所依赖的C的本土感觉,惯用的绑定。为此,您需要在Python中重新包装包装器,此时使用Cython可能更好。它可以很好地用于绑定,你不能投入足够的工作来使真正的好,并且方便的是你可以在其中一次将API暴露给多种语言。

答案 1 :(得分: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可以避免在函数defs上使用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

答案 2 :(得分:1)

答案 3 :(得分:0)

嗯,创建Python插件的最简单方法是使用C ++和Boost.Python。在您的示例中,扩展模块看起来很简单:

#include <boost/python.hpp>
using namespace boost::python;

// ... your valuex function goes here ...

BOOST_PYTHON_MODULE(yourModuleName)
{
    def("valuex", valuex, "an optional documentation string");
}

Boost.Python在流行的操作系统上可用,也应该与Python 3一起使用(未经过测试,但是在2009年增加了支持)。

关于SWIG:它不仅适用于Unix。您可以下载预编译的Windows binaries或使用MinGW / MSYS自行编译。

你可以尝试一下据说是Python 3 compatible的Cython。

答案 4 :(得分:0)

在PyCon 2009上,我谈到了如何编写Python C扩展:A Whirlwind Excursion through Python C Extensions。其中没有特定于Windows的内容,但它涵盖了扩展的基本结构。