Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为绝对初学者制作适用于Windows的Python扩展_Python_Windows_Python 3.x - Fatal编程技术网

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

如何为绝对初学者制作适用于Windows的Python扩展,python,windows,python-3.x,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 ((

我一直在互联网上寻找在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));
}
#包括
#包括
双值X(浮动值、双速率、双时间X)
{
浮动值;
双速率,timex;
返回值/(双)功率((1+速率),(timex));
}
您希望将其转换为Python3模块,以便在windows(64位,如果有区别的话)系统上使用。你会怎么做呢?我查阅了SWIG和Pyrex,在这两种情况下,它们似乎都面向unix用户。对于Pyrex,我不确定它是否适用于Python3

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

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


谢谢。

开始是文档。

< P>嗯,创建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;
// ... 你的valuex函数在这里。。。
BOOST_PYTHON_模块(yourModuleName)
{
def(“valuex”,valuex,“可选文档字符串”);
}
Python可以在流行的操作系统上使用,并且应该也可以与Python3一起使用(虽然没有测试,但是在2009年增加了对它的支持)

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

你也可以尝试一下Cython,据说是这样。

Cython(Pyrex解决了一些难题,并做出了实用性决定)可以使用一个代码库来制作Python2和Python3模块。对于制作2和3的库来说,这是一个非常好的选择。说明了如何使用它,但它并没有揭开Windows编程、C或Python编程或一般编程的神秘面纱,因为它可以为您简化一些事情


当您遇到问题时,SWIG可能很难使用,并且不会特别有助于创建您所依赖的C的非常自然的感觉和惯用的绑定。为此,您需要用Python重新包装包装器,此时使用Cython可能会更好。对于无法投入足够的工作来实现真正的好绑定来说,它是很好的,并且很方便,因为您可以在其中同时向多种语言公开API。

根据您的尝试,将“扩展”构建为一个简单的DLL并访问它可能是目前为止最简单的方法

我使用了您的代码,稍微调整后保存为
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));
    }
(我相信添加
-rdynamic
可以避免将DLL\u导出散布到函数定义中。)

这将生成
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

在Pycon2009上,我做了一个关于如何编写PythonC扩展的演讲:。它没有特定于Windows的内容,但它涵盖了扩展的基本结构。

@JR,Cython对Windows用户也非常适用。@JR,上面有缺陷吗?想必你是想把
pow()
的输出转换成双倍的?谢谢,我会看看Cython,看看我的初学者大脑能做些什么。至于你是最新的,是的,我想你是对的。我只是在工作时写的,未经测试。+1,我过去就是这样做的。如果您这样做是出于性能原因,那么您应该知道ctypes确实会增加一些开销。这家伙运行了一些基准测试:@FogleBird,谢谢链接!总之,他似乎说,对于调用机制来说,ctypes可能比更直接的方法慢2-3倍,这使得“细粒度”工作(即对短例程的许多调用)变得很糟糕。(这是我警告“取决于您尝试执行的操作”的一个原因。)我尝试了此方法,但遗憾的是,tcc for windows仅支持32位版本(至少根据自述文件),这解释了为什么我无法在此行“mydll=cdll.mydll”加载.dll。不过,我目前正在尝试设置Cython,我想我就快到了。@JR,我使用TCC只是为了演示,但您可以使用任何其他适合您的编译器。不管怎样,您都需要一个能正常工作的编译器来实现这一点(可能是mingw或vc++)。
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