C ++ API声明因Cython而失败

时间:2014-03-17 07:14:38

标签: python c++ python-2.7 g++ cython

我有两个文件module.pyxfoo.cpp。我希望能够在module.pyx内调用在cython模块foo.cpp中声明的函数。此函数返回指向矢量的指针:

module.pyx

#distuils: language = c++

from libcpp.vector cimport vector
from cython.operator cimport dereference as deref

cdef api vector[int] *func():
    cdef vector[int] *v = new vector[int]()
    deref(v).push_back(3)
    return v


foo.cpp

#include "module_api.h"
#include <vector>
#include <iostream>

using namespace std;

int main() {
    import_module();
    vector<int> *v = func();
    cout << "v[0] = " << v[0] << endl;
}


我用

编译了module.pyx

cython module.pyx --cplus

foo.cpp

g++ foo.cpp -I/Users/richizy/anaconda/include/python2.7/

但它不起作用。我得到一个巨大的错误,说明“名称空间中的向量'std'没有命名类型”,还有很多其他的东西。有什么问题?

我正在使用Anaconda Python发行版,我刚刚做了一个干净的&amp; amp;默认安装。

版本:

  

g ++(MacPorts gcc47 4.7.3_3 + universal)4.7.3

     

Cython版本0.20.1

     

Python 2.7.6 :: Anaconda 1.9.1(x86_64)

     

Mac OS X 10.8.4

1 个答案:

答案 0 :(得分:3)

为了能够使用C或C ++应用程序中的python引擎, 你需要确保在开始时调用Py_Initialize() 你的main()函数,以及Py_Finalize()的调用 结束。您还没有看到import_module()函数 实际上会产生错误,但它使用python错误执行此操作 机制。您可以通过添加以下代码使其可见 低于import_module()

if (PyErr_Occurred())
{
    PyErr_Print();
    return -1;
}

如果你这样做,你会看到出现以下错误:

ImportError: No module named module

为了能够使用Cython模块,您必须确保 在这种情况下,调用该模块的init函数 initmodule()。不幸的是,似乎宣言了 生成的头文件中不存在此函数, 所以我们必须手动将它添加到main:

之上
PyMODINIT_FUNC initmodule(void);

首先放置vector包含行和小行 修复cout行后,代码变为:

#include <vector>
#include <iostream>
#include "module_api.h"

using namespace std;

PyMODINIT_FUNC initmodule(void);

int main() {
    Py_Initialize();
    initmodule();
    import_module();
    if (PyErr_Occurred())
    {
        PyErr_Print();
        return -1;
    }
    vector<int> *v = func();
    cout << "v[0] = " << (*v)[0] << endl;
    Py_Finalize();
    return 0;
}

至少在我的系统上,产生输出:

v[0] = 3