我一直在用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 build
,python 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模块。
答案 0 :(得分:1)
这很可能意味着您导入的共享库具有与Python发行版不兼容的二进制接口。
所以在你的情况下:你有一个64位的Python,你正在导入一个32位的库,反之亦然。 (或者在评论中建议使用不同的编译器。)
答案 1 :(得分:0)
与multivec's cython模块有类似的问题。我猜测编译器和Anaconda库之间存在不兼容问题。
通过升级Anaconda libgcc
包解决了这个问题:conda install libgcc