Python DLL扩展导入
我为我的Python程序创建了一些扩展,并生成了一个叫做abcPython.dll
的文件。请问我该如何在我的Python脚本中导入这个dll文件呢?
当我尝试用以下命令导入它时,出现了一个错误信息:
>>>import abcPython
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named abcPython
>>>
我手动创建了一个系统环境变量,叫做PYTHONPATH
,这个变量存储了abcPython.dll
的路径,但错误依然存在。
我该如何解决这个问题呢?
4 个回答
简单地把 .dll 文件改成 .pyd 文件并没有解决问题。我当时使用 SWIG 来创建扩展模块。我直接创建了一个 .pyd 文件,而不是 .dll 文件,这样问题就解决了。
哎呀!又遇到一个2.X和3.X的坑。错误信息是:
ImportError: 动态模块没有定义初始化函数 (PyInit_abcPython)
注意这个前缀:不是init,而是PyInit_
可以查看一下3.1 的文档 ... “初始化函数必须命名为 PyInit_name(),其中 name 是模块的名字”
请仔细阅读 在Windows上构建C和C++扩展 的内容 - 在第7小节中提到:
输出文件应该命名为 spam.pyd(在发布模式下)或 spam_d.pyd(在调试模式下)。选择 .pyd 这个后缀是为了避免和系统库 spam.dll 混淆,因为你的模块可能是这个库的Python接口。
...
在2.5版本中更改:之前,像 spam.dll(在发布模式下)或 spam_d.dll(在调试模式下)这样的文件名也是被认可的。
试着把你的 DLL
文件重命名为 .pyd
后缀,而不是 .dll
。
(感谢 Peter Hansen)
这个参考链接指向一个 C
示例,其中明确包含了一个初始化函数,PyMODINIT_FUNC initexample(void)
。生成的DLL应该重命名为 example.pyd
:
#include "Python.h"
static PyObject *
ex_foo(PyObject *self, PyObject *args)
{
printf("Hello, world\n");
Py_INCREF(Py_None);
return Py_None;
}
static PyMethodDef example_methods[] = {
{"foo", ex_foo, METH_VARARGS, "foo() doc string"},
{NULL, NULL}
};
PyMODINIT_FUNC
initexample(void)
{
Py_InitModule("example", example_methods);
}