【发布时间】:2015-11-05 09:57:31
【问题描述】:
我在正确初始化 NumPy C API 时遇到问题。我想我已经将问题隔离到从不同的翻译单元调用import_array,但我不知道为什么这很重要。
最小的工作示例:
header1.hpp
#ifndef HEADER1_HPP
#define HEADER1_HPP
#include <Python.h>
#include <numpy/npy_3kcompat.h>
#include <numpy/arrayobject.h>
void initialize();
#endif
file1.cpp
#include "header1.hpp"
void* wrap_import_array()
{
import_array();
return (void*) 1;
}
void initialize()
{
wrap_import_array();
}
file2.cpp
#include "header1.hpp"
#include <iostream>
void* loc_wrap_import_array()
{
import_array();
return (void*) 1;
}
void loc_initialize()
{
loc_wrap_import_array();
}
int main()
{
Py_Initialize();
#ifdef USE_LOC_INIT
loc_initialize();
#else
initialize();
#endif
npy_intp dims[] = {5};
std::cout << "creating descr" << std::endl;
PyArray_Descr* dtype = PyArray_DescrFromType(NPY_FLOAT64);
std::cout << "zeros" << std::endl;
PyArray_Zeros(1, dims, dtype, 0);
std::cout << "cleanup" << std::endl;
return 0;
}
编译器命令:
g++ file1.cpp file2.cpp -o segissue -lpython3.4m -I/usr/include/python3.4m -DUSE_LOC_INIT
./segissue
# runs fine
g++ file1.cpp file2.cpp -o segissue -lpython3.4m -I/usr/include/python3.4m
./segissue
# segfaults
我已经使用 Clang 3.6.0、GCC 4.9.2、Python 2.7 和 Python 3.4 进行了测试(使用适当修改的 wrap_import_array,因为这在 Python 2.x 和 3.x 之间是不同的)。各种组合都给出相同的结果:如果我不调用loc_initialize,程序将在PyArray_DescrFromType 调用中出现段错误。我有 NumPy 版本 1.8.2。作为参考,我在 Ubuntu 15.04 中运行它。
最让我困惑的是this C++ NumPy wrapper 似乎在不同的翻译单元中调用import_array。
我错过了什么?为什么我必须从同一个翻译单元调用import_array 才能真正生效?更重要的是,当我从不同的翻译单元(如 Boost.NumPy 包装器)调用 import_array 时,如何让它工作?
【问题讨论】:
标签: python c++ python-2.7 python-3.x numpy