2011-05-29 86 views
7

我有一个Python脚本,我将脚本重命名为.pyx文件。我想将此代码编译为一个stand dll文件。如何使用Cython创建站点dll

我在this document看到Cython会创建一个dll文件,但我只得到一个pyd。

我有MinGW和尝试使用命令python setup.py build --compiler=mingw32编译脚本我的代码(只是一个Hello World):

def init(): 
    return "hello world" 

任何想法?谢谢

+2

这不是用Cython是。它是用Python方言编写CPython扩展的,它可以并且应该用于编写必须与Python密切协作的低级静态类型代码。不用于将python代码转换为可以从不相关代码中调用的内容(例如不知道CPython的C程序)。 – delnan 2011-05-29 21:04:55

回答

3

所以首先要做的是将 文件重命名为helloworld.pyx。现在我们需要 make setup.py,这就像是一个 python Makefile(更多信息 参见编译)。你setup.py应该 样子:

from distutils.core import setup 
from distutils.extension import Extension 

from Cython.Distutils import build_ext 
    setup(
     cmdclass = {'build_ext': build_ext}, 
     ext_modules = [Extension("helloworld", 
    ["helloworld.pyx"])]) 

以此来建立你用Cython文件 使用命令行选项:

$ python setup.py build_ext --inplace 

这将留在你的本地 目录名为HelloWorld的一个文件。所以在unix 或helloworld.dll在Windows中。

我们 使用本文件:启动蟒蛇 解释,并导入它仿佛 这是一个普通的Python模块:

+0

谢谢。我做的和你一样,在xp sp3中,但我不能得到一个helloworld.dll,但有一个helloword.pyd和一个生成文件夹。这是我想知道为什么没有DLL填充 – ljx0517 2011-05-30 01:14:46

+0

[pyd = dll与Python函数](http://stackoverflow.com/a/11797037/819417) – 2014-05-02 08:47:57

3

Is a *.pyd file the same as a DLL?

是,.pyd文件是DLL的,但有一些差异。如果您的 有一个名为foo.pyd的DLL,那么它必须具有函数PyInit_foo()。 然后,您可以编写Python“import foo”,Python将搜索 foo.pyd(以及foo.py,foo.pyc),如果发现它,将尝试 以调用PyInit_foo()来初始化它。您不要将您的.exe与 foo.lib链接,因为这会导致Windows要求DLL存在。

请注意,foo.pyd的搜索路径为PYTHONPATH,与Windows用于搜索foo.dll的路径不同。 。此外,foo.pyd需要 不能用于运行您的程序,而如果您将程序 与dll链接,则需要dll。当然,如果你想 想说import foo,则需要foo.pyd。在DLL中,链接在源 代码__declspec(dllexport)中声明。在.pyd中,链接定义在 可用函数列表中。

Modifying Python’s Search PathAbsolute and Relative Imports