我一直在环顾networking,试图find一个很好的一步一步的指导,在Windows中扩展Python,我一直没能find我的技能水平的东西。
假设你有一些看起来像这样的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。
我只是想学习编程的基础知识,用一些实际的例子。
最后,如果有一本好书可以推荐学习扩展,我将不胜感激。
谢谢。
Cython(pyrex有几个解决方法,并且为实用性做出决定)可以使用一个代码库来制作Python 2和Python 3模块。 这对于制作2和3的库是一个非常好的选择。 用户指南解释了如何使用它,但它并没有揭示Windows编程或C或Python或一般的编程,它可以为你简化一些事情。
当遇到问题时,SWIG可能很难处理,并且不会特别有助于创建您所依赖的C的本地感,习惯性约束。 为此,您需要重新封装Python中的封装,在这一点上,使用Cython可能会更好。 对于绑定来说,这样做可能会很好,因为您无法投入足够的工作来制作出真正好的内容,而且方便,因为您可以一次性将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编译器,并用这个命令调用。
tcc -shared mydll.c
(我相信加入-rdynamic
将避免需要将DLL_EXPORT遍布在函数defs中。)
这生成了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
一开始就是Windows上的Building C和C ++ Extensions文档。
那么,创建Python插件最简单的方法就是使用C ++和Boost.Python。 在你的例子中,扩展模块看起来像这样简单:
#include <boost/python.hpp> using namespace boost::python; // ... your valuex function goes here ... BOOST_PYTHON_MODULE(yourmoduleeName) { def("valuex", valuex, "an optional documentation string"); }
Boost.Python可以在流行的操作系统上使用,并且也可以与Python 3一起工作(虽然没有经过测试,但在2009年增加了支持)。
关于SWIG:这不仅适用于Unix。 您可以下载预编译的Windows二进制文件或使用MinGW / MSYS自行编译它。
你也可以尝试一下据说是Python 3兼容的 Cython。
在PyCon 2009上,我介绍了如何编写Python C扩展: 一个通过Python C扩展的Whirlwind Excursion 。 其中没有特定的Windows,但它涵盖了扩展的基本结构。