C++API声明与Cython一起失败

C++ API declaration fail with Cython

本文关键字:一起 失败 Cython 声明 C++API      更新时间:2023-10-16

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

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

和带有的CCD_ 9

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

但它不起作用。我得到了一个巨大的错误,声明"命名空间'std'中的向量没有命名类型",以及其他许多事情。问题出在哪里?

我使用的是Anaconda Python发行版,我最近刚刚做了一次清理;默认安装。

版本:

g++(MacPorts gcc47 4.7.3_3+通用(4.7.3

Cython版本0.20.1

Python 2.7.6::Anaconda 1.9.1(x86_64(

Mac OS X 10.8.4

要使用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函数CCD_ 16。不幸的是该函数不存在于生成的头文件中,所以我们必须手动将其添加到主菜单之上:

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