Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python C++;API声明与Cython一起失败_Python_C++_Python 2.7_G++_Cython - Fatal编程技术网

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