Python C++;API声明与Cython一起失败
我有两个文件Python C++;API声明与Cython一起失败,python,c++,python-2.7,g++,cython,Python,C++,Python 2.7,G++,Cython,我有两个文件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 v
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_api.h”
#包括
#包括
使用名称空间std;
int main(){
导入_模块();
向量*v=func();
CUT能够从C或C++应用程序使用Python引擎
您需要确保在开始时调用了
Py\u Initialize()
您的main()
函数的
结束。您还没有看到的是import\u module()
函数
实际上会产生一个错误,但它使用python错误来实现这一点
您可以通过添加以下代码使其可见
下面是导入模块()
:
如果执行此操作,将出现以下错误:
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;
}
交换两行
#包括“module_api.h”
和#include
为我解决了vector的问题,但后来我遇到了segfault。但是我无法从文档中获得delorean
示例,所以我一定是出了什么问题。你好,再次Hivert。在谷歌附近徘徊之后,我认为我的错误是因为忘记了与Python库的链接(在我的例子中,它位于/Users/richizy/anaconda/lib/python2.7/config/libpython2.7.a
)。但是,正如您所说,我还是遇到了一个seg错误。seg错误可能是因为在访问向量之前没有取消对向量的引用。请执行(*v)[0]
而不是v[0]在C++中,它看起来像是一个bug。我复制了代码。但是我得到了一个问题:<代码> PyMODINITION FUNC InMeLTube(无效)>代码>或代码> InMeultMeMe()/<代码>:代码>未定义的符号x8664:“μi模块”,引用自:_mainin ccSkO2qw.o
是否必须在其他地方实现initmodule
,例如在module_api.h
中?尽管如此,如果我删除initmodule
,我将复制相同的错误消息:importorror:没有名为module的模块
@ricizy,即应在.cpp文件中定义“initmodule”从module.pyx开始分级
#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