我创建了一个带有附加c ++扩展名的python程序包,该扩展程序使用ctypes包装。 由于这是一个c ++类,因此我在头文件中定义了一个外部c接口。
extern "C" {
void* create_reader(int key);
void release_reader(void* reader);
void* read_data(void* reader);
}
然后我使用ctypes加载由此创建的共享库
lib_path = glob.glob(os.path.join(fpath, "api*.so"))[0]
lib = ctypes.cdll.LoadLibrary(lib_path)
lib.read_data.argtype = ctypes.c_void_p
lib.read_data.restype = ctypes.POINTER(ctypes.c_byte)
此外,我创建一个类来包装c ++类 然后将ctypes指针包装到numpy数组(这只是代码的一部分)
class Test:
def __init__(self, key):
self._reader = lib.create_shm_reader(ikey)
def get_buffer(self):
ptr = lib.read_data(self._reader)
nx, ny = 100, 100
size = 3
return np.copy(np.ctypeslib.as_array(ptr, shape=shape))
因此,基本上,C ++阅读器会创建一些指向内存缓冲区的指针,该指针比 映射到一个numpy数组。
使用distutils.Extension
将c ++代码构建到* .so库中。
只要我在安装了cython的python虚拟环境中构建此程序包,一切正常。 在c ++部分中,将生成一些数据,然后将其传输到我可以从python读取的numpy数组中。
但是,当我将Conda(尤其是miniconda)与干净的conda env(包括cython)一起使用时, 当调用read_data函数时,我立即收到分段错误。 在我看来,Conda在链接共享库时遇到了一些问题, 因为read_data函数被调用并立即发生段错误(使用printf测试)
对于这两种情况,ctypes版本均为1.1.0
,而python为3.6.9
。
那么使用conda时发生此段错误的原因是什么?
感谢您的反馈。 BR jrsm
我使用pip install .
从存储库根目录安装软件包
所以在conda中,我也使用pip来安装软件包。
因此,我的假设是pip使用的设置与anaconda的运行期间和构建期间不同?
我在此github存储库中提供了一个完整的运行示例: https://github.com/jr7/condatest
自述文件详细说明了如何设置和执行。