我有两个文件module.pyx
和foo.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
答案 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