使用Conda构建带有扩展名的python包会导致分段错误

时间:2020-07-03 09:44:53

标签: python c++ conda ctypes distutils

我创建了一个带有附加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

UPDATE1:

我使用pip install . 从存储库根目录安装软件包 所以在conda中,我也使用pip来安装软件包。 因此,我的假设是pip使用的设置与anaconda的运行期间和构建期间不同?

UPDATE2:

我在此github存储库中提供了一个完整的运行示例: https://github.com/jr7/condatest

自述文件详细说明了如何设置和执行。

0 个答案:

没有答案