如何使用Cython创建一个独立的DLL

12 投票
2 回答
13426 浏览
提问于 2025-04-16 18:35

我有一个Python脚本,我把这个脚本的名字改成了.pyx文件。我想把这个代码编译成一个独立的dll文件。

我在这个文档里看到Cython会生成一个dll文件,但我只得到了一个pyd文件。

我安装了mingw,并尝试用命令python setup.py build --compiler=mingw32来编译我的代码(其实就是一个简单的hello world):

def init():
    return "hello world"

有什么建议吗?谢谢!

2 个回答

6

*.pyd文件和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文件中,链接是通过一个可用函数的列表来定义的。

修改Python的搜索路径, 绝对和相对导入

9

首先,我们要把文件重命名为 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 模块一样导入它:

撰写回答