Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy ctypes“;动态模块未定义初始化函数“;如果每次未重新编译,则出错_Python_C++_Numpy_Ctypes - Fatal编程技术网

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()