我一直在寻找互联网,试图找到一个很好的分步指南来扩展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。
我只是尝试使用一些实际的例子来学习编程的基础知识。
最后,如果有一本好书可以推荐学习扩展,我会非常感激。
谢谢。
答案 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的内容,但它涵盖了扩展的基本结构。