导入我的c ++模块时,这个ImportError是什么意思?

时间:2016-10-17 16:49:32

标签: python c++

我一直在用C ++编写Python模块。我有一个可以独立运行的C ++ program。它工作得很好,但我认为如果我真的可以像Python中的函数一样调用它会更好。所以我尽力去做,并构建和安装。这是我的模块的代码(称为nnrunner.cpp):

#include <Python.h>
#include <vector>
#include "game.h"
#include "neuralnetai.h"

using namespace std;

/**************************************************
 * This is the actual function that will be called
 *************************************************/
static int run(string filename)
{
    srand(clock());
    Game * pGame = new Game();

    vector<int> topology;
    topology.push_back(20);

    Network net(31, 4, topology);

    net.fromFile(filename);

    NNAI ai(pGame, net);

    pGame->setAI(&ai);

    while (!pGame->isGameOver())
        pGame->update(NULL);

    return pGame->getScore();
}

static PyObject *
nnrunner_run(PyObject * self, PyObject * args)
{
    string filename;
    int score;
    if (!PyArg_ParseTuple(args, "s", &filename))
        return NULL;
    score = run(filename);
    return PyLong_FromLong(score);
}

static PyMethodDef NnrunnerMethods[] = {
        {"run",  nnrunner_run, METH_VARARGS,
         "Run the game and return the score"},
        {NULL, NULL, 0, NULL}        /* Sentinel */
};

static struct PyModuleDef nnrunnermodule = {
        PyModuleDef_HEAD_INIT,
        "nnrunner",   /* name of module */
        NULL, /* module documentation, may be NULL */
        -1,       /* size of per-interpreter state of the module,
                or -1 if the module keeps state in global variables. */
        NnrunnerMethods
};

PyMODINIT_FUNC
PyInit_nnrunner(void)
{
    PyObject *m;

    m = PyModule_Create(&nnrunnermodule);
    if (m == NULL)
        return NULL;

    return m;
}

我的构建脚本(称为setup.py):

from distutils.core import setup, Extension

module1 = Extension('nnrunner',
                    sources = ['nnrunner.cpp', 'game.cpp', 'uiDraw.cpp', 
                    'uiInteract.cpp', 'player.cpp', 'ship.cpp', 'network.cpp'],
                    libraries = ['glut', 'GL', 'GLU'])

setup (name = 'NNRunner',
       version = '1.0',
       description = 'This is my first package',
       ext_modules = [module1])

由于依赖性,它必须使用-lglut -lGL -lGLU进行编译,但它实际上并没有任何UI。 我可以编译并安装它(python setup.py buildpython setup.py install)但是当我尝试导入它时,我会收到错误:

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  2 2016, 17:53:06) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import nnrunner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /home/justin/anaconda3/lib/python3.5/site-packages/nnrunner.cpython-35m-x86_64-linux-gnu.so: undefined symbol: _ZTVNSt7__cxx1115basic_stringbufIcSt11char_traitsIcESaIcEEE
>>> 

有人能指出我的文件方向吗?这是我第一次尝试用C ++制作Python模块。

2 个答案:

答案 0 :(得分:1)

这很可能意味着您导入的共享库具有与Python发行版不兼容的二进制接口。

所以在你的情况下:你有一个64位的Python,你正在导入一个32位的库,反之亦然。 (或者在评论中建议使用不同的编译器。)

答案 1 :(得分:0)

multivec's cython模块有类似的问题。我猜测编译器和Anaconda库之间存在不兼容问题。

通过升级Anaconda libgcc包解决了这个问题:conda install libgcc