我有两个文件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/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函数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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句