Python DLL扩展导入

时间:2009-12-30 11:51:49

标签: python dll

我为Python创建了扩展并创建了abcPython.dll。如何将这个dll导入我的Python脚本?

当我尝试使用以下命令导入它时收到错误消息

>>>import abcPython
>>>Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     ImportError: No module named abcPython
>>>

我手动创建了一个名为PYTHONPATH的系统环境变量,该变量存储了abcPython.dll的路径,但仍然存在错误。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:12)

小心地关注Building C and C++ Extensions on Windows - 在第7小节中,它说:

  

输出文件应称为spam.pyd(在发布模式下)或spam_d.pyd(在调试模式下)。选择扩展名.pyd 是为了避免与您的模块可能是Python接口的系统库spam.dll混淆   ...
  在版本2.5中更改:以前,还识别了spam.dll(在发布模式下)或spam_d.dll(在调试模式下)等文件名。

尝试重命名DLL以使用.pyd扩展名而不是.dll

(谢谢,Peter Hansen

引用指向C example,它明确包含INIT函数, 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);
}

答案 1 :(得分:2)

Aarrgghh!又一个2.X / 3.X陷阱。 RTFErrorMessage:

ImportError: dynamic module does not define init function (PyInit_abcPython)

注意前缀:它不是 init ,它是 PyInit _

参见3.1 docs ...“初始化函数必须命名为PyInit_name(),其中name是模块的名称”

答案 2 :(得分:1)

简单地将.dll重命名为.pyd没有用。我正在使用SWIG创建扩展模块。我创建了一个.pyd而不是创建.dll模块,这解决了这个问题。

答案 3 :(得分:0)

举个例子:想象一下,你已经编译了OpenCV并且有几个* .dll和cv2.pyd文件。

您需要将这些文件复制到python目录中的“DLLs”文件夹中。

然后导入模块以检查它是否正常。