编程语言
首页 > 编程语言> > python-Cython的C API声明失败

python-Cython的C API声明失败

作者:互联网

我有两个文件module.pyx和foo.cpp.我希望能够调用在cython模块module.pyx中声明的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 /用户/richizy/anaconda/include/python2.7/

但它不起作用.我收到一个巨大的错误,指出“在命名空间’std’中的向量没有命名类型”,还有许多其他事情.问题是什么?

我使用的是Anaconda Python发行版,我最近做了一次清理工作.默认安装.

版本:

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

Cython version 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函数
initmodule().不幸的是,似乎
此函数在生成的头文件中不存在,
因此,我们必须手动将其添加到主体上方:

PyMODINIT_FUNC initmodule(void);

连同放置向量一起,包括行首和一小段
在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

标签:python-2-7,g,cython,python,c-4
来源: https://codeday.me/bug/20191122/2055998.html