如何使用Cython创建一个独立的DLL
我有一个Python脚本,我把这个脚本的名字改成了.pyx文件。我想把这个代码编译成一个独立的dll文件。
我在这个文档里看到Cython会生成一个dll文件,但我只得到了一个pyd文件。
我安装了mingw,并尝试用命令python setup.py build --compiler=mingw32
来编译我的代码(其实就是一个简单的hello world):
def init():
return "hello world"
有什么建议吗?谢谢!
2 个回答
是的,.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文件中,链接是通过一个可用函数的列表来定义的。
首先,我们要把文件重命名为 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 模块一样导入它: