.pyd
文件是Python的动态链接库(DLL)文件。这里主要描述的是.pyd
文件和普通的.dll
文件之间的差异,以及如何在Python中使用它们。
主要区别:
-
初始化函数:
.pyd
文件必须有一个名为PyInit_<module_name>()
的函数。例如,如果有一个名为foo.pyd
的文件,它必须包含一个PyInit_foo()
函数。这个函数在导入模块时被调用,用于初始化模块。 -
导入方法: 在Python中,可以使用
import foo
导入foo.pyd
文件。Python将搜索foo.pyd
、foo.py
、foo.pyc
等文件。如果找到foo.pyd
,Python将尝试调用PyInit_foo()
来初始化它。 -
链接: 不会将
.exe
文件与foo.lib
链接,因此Windows不要求DLL必须存在。如果程序中使用了DLL,该DLL必须存在,但是.pyd
文件只有在导入时才需要。 -
搜索路径:
foo.pyd
的搜索路径是PYTHONPATH
,这与Windows用来搜索foo.dll
的路径不同。 -
导出声明: 在DLL中,使用
__declspec(dllexport)
在源代码中声明链接。在.pyd
文件中,链接是在可用函数的列表中定义的。
补充:
.pyd
文件通常不直接链接到主执行文件,而是在运行时通过Python的导入机制动态加载。- 如果你的Python程序尝试导入一个模块,并且Python找到了对应的
.pyd
文件,但没有找到PyInit_<module_name>()
函数,那么导入将失败。
总之,.pyd
文件是一种特殊类型的DLL,它专为Python设计,使得Python可以轻松地使用C/C++编写的库。在设计和使用上,它与普通的DLL文件存在一些不同,主要是为了更好地与Python的导入和模块系统集成。
Boost.python会自动生成PyInit_<module_name>()
函数。