【问题标题】:How to use Cython to create a stand dll如何使用 Cython 创建一个stand dll
【发布时间】:2011-05-29 21:02:56
【问题描述】:

我有一个 Python 脚本,我将脚本重命名为 .pyx 文件。我想把这段代码编译成一个标准的 dll 文件。

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

我有 mingw 并尝试使用命令 python setup.py build --compiler=mingw32 来编译脚本我的代码(只是一个你好世界):

def init():
    return "hello world"

有什么想法吗?谢谢

【问题讨论】:

  • 这不是 Cython 的用途。它用于以 Python 方言编写 CPython 扩展,可以而且应该用于编写必须与 Python 密切合作的低级静态类型代码。不适用于将 python 代码转换为可以从无关代码调用的东西(例如不了解 CPython 的 C 程序)。

标签: python dll


【解决方案1】:

所以首先要做的就是重命名 文件到 helloworld.pyx。现在我们需要 制作 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

这会将文件留在您的本地 unix 中名为 helloworld.so 的目录 或 Windows 中的 helloworld.dll。

现在 使用这个文件:启动 python 解释器并简单地导入它,就好像 这是一个普通的 python 模块:

【讨论】:

  • 谢谢。我和你一样,在 xp sp3 中。但我无法获得 helloworld.dll,但有一个 helloword.pyd 和一个构建文件夹。这是我想知道为什么没有 dll 填充
  • @JaKob Bowyer 如果我运行上面给出的相同命令,我将获得 .c 扩展名文件。我可以知道为什么我得到 .c 扩展名而不是 .dll 文件。
【解决方案2】:

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。当然,如果你需要 foo.pyd 想说import foo。在 DLL 中,链接在源中声明 代码为__declspec(dllexport)。在 .pyd 中,链接定义在 可用功能列表。

Modifying Python’s Search Path, Absolute and Relative Imports

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-22
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多