Python DLL扩展导入

4 投票
4 回答
11170 浏览
提问于 2025-04-15 17:29

我为我的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 个回答

1

简单地把 .dll 文件改成 .pyd 文件并没有解决问题。我当时使用 SWIG 来创建扩展模块。我直接创建了一个 .pyd 文件,而不是 .dll 文件,这样问题就解决了。

2

哎呀!又遇到一个2.X和3.X的坑。错误信息是:

ImportError: 动态模块没有定义初始化函数 (PyInit_abcPython)

注意这个前缀:不是init,而是PyInit_

可以查看一下3.1 的文档 ... “初始化函数必须命名为 PyInit_name(),其中 name 是模块的名字”

13

请仔细阅读 在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);
}

撰写回答