Python numpy ctypes“;动态模块未定义初始化函数“;如果每次未重新编译,则出错
很抱歉,还有一个关于Python numpy ctypes“;动态模块未定义初始化函数“;如果每次未重新编译,则出错,python,c++,numpy,ctypes,Python,C++,Numpy,Ctypes,很抱歉,还有一个关于动态模块未定义init函数的问题。我确实问了一些老问题,但我没有找到一个专门针对我的案例的问题 我有一个C++库,它应该导出几个函数到Python(比如在代码> Extn”C“{} /代码>块中定义的~ 5个函数”。每次导入库时,当我重新编译库时,它工作得很好。但是,如果我在不重新编译的情况下导入它,则会出现错误ImportError:动态模块未定义init函数(initmylib) 重现相同行为(错误)的非常简化的示例如下所示: 文件mylib.cpp中的C++库代码 #i
动态模块未定义init函数的问题。我确实问了一些老问题,但我没有找到一个专门针对我的案例的问题
我有一个C++库,它应该导出几个函数到Python(比如在代码> Extn”C“{} /代码>块中定义的~ 5个函数”。每次导入库时,当我重新编译库时,它工作得很好。但是,如果我在不重新编译的情况下导入它,则会出现错误
ImportError:动态模块未定义init函数(initmylib)
重现相同行为(错误)的非常简化的示例如下所示:
文件mylib.cpp中的C++库代码
#include <math.h>
// there are some internal C++ functions and classes
// which are not exported, but used in exported functions
extern "C"{
// one of the functions which should be accessible from python
void oscilator( double dt, int n, double * abuff, double * bbuff ){
double a = abuff[0];
double b = bbuff[0];
for (int i=1; i<n; i++){
a = a - b*dt;
b = b + a*dt;
abuff[i] = a;
bbuff[i] = b;
}
}
// there are also other functions but let's keep this example simple
// int initmylib( ){ return 0; } // some junk ... if this makes ctypes happy ?
}
python程序test.py
导入mylib
import os
from pylab import *
from basUtils import *
# this will delete all compiled files of the library to force recompilation
def makeclean( ):
[ os.remove(f) for f in os.listdir(".") if f.endswith(".so") ]
[ os.remove(f) for f in os.listdir(".") if f.endswith(".o") ]
[ os.remove(f) for f in os.listdir(".") if f.endswith(".pyc") ]
# if I do makeclean() every time it works, if I do not it does not
#makeclean( )
import mylib
a=zeros(100)
b=zeros(100)
a[0] = 1
mylib.oscilator( 0.1, a, b )
plot( a )
plot( b )
show()
我还试图通过在mylib.cpp
中添加一些intinitmylib(){return 0;}
函数来使ctypes满意,正如您在上面的代码中看到的那样。但是,这将产生错误SystemError:动态模块未正确初始化
当我编译scipy课堂讲稿中的示例时,我没有这个问题。但是,只有当我只想导入一个与库名称同名的函数时,这个示例才有效。我想要更一般的 尝试运行导入imp;打印imp.find_模块('mylib')[1]
。它选择mylib.so而不是mylib.py,您感到惊讶吗?解释器希望mylib.so是一个扩展模块,对于CPython 2.x,它应该定义一个名为initmylib
的初始化函数。为避免意外尝试导入共享库,请将名称更改为类似于_mylib.so或mylib.1.0.so的名称,或者将文件保存在不在sys.path
中的目录中
请注意,Windows扩展模块是dll,但扩展名是.pyd而不是.dll。因此,import mylib
不会尝试加载mylib.dll。eryksun>啊,谢谢,你说得对,编译库的文件名就是问题所在。使用lib_mylib。因此
工作正常。你想让reguler回答,这样我就可以接受它并关闭问题了吗?eryksun>啊,谢谢,你是对的,编译库的文件名就是问题所在。使用lib_mylib.so可以很好地工作。
import os
from pylab import *
from basUtils import *
# this will delete all compiled files of the library to force recompilation
def makeclean( ):
[ os.remove(f) for f in os.listdir(".") if f.endswith(".so") ]
[ os.remove(f) for f in os.listdir(".") if f.endswith(".o") ]
[ os.remove(f) for f in os.listdir(".") if f.endswith(".pyc") ]
# if I do makeclean() every time it works, if I do not it does not
#makeclean( )
import mylib
a=zeros(100)
b=zeros(100)
a[0] = 1
mylib.oscilator( 0.1, a, b )
plot( a )
plot( b )
show()