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