我为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
的路径,但仍然存在错误。
我该如何解决这个问题?
答案 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”文件夹中。
然后导入模块以检查它是否正常。