我正在尝试在C ++中使用Python并具有以下代码。我打算在用户输入路径上解析并执行sys.path.append。看起来对PyRun_SimpleString的调用导致某种类溢出到类的私有类var中。这怎么发生的?我尝试了各种缓冲区大小50,150,200,并没有改变输出。
class Myclass
{
...
private:
char *_modName;
char *_modDir;
};
Myclass::Myclass()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString((char *)"sys.path.append('/home/userA/Python')");
}
Myclass::init()
{
// this function is called before Myclass::test()
// a couple other python funcitons are called as listed below.
// PyString_FromString, PyImport_Import, PyObject_GetAttrString, PyTuple_New, PyTuple_SetItem, PyObject_CallObject, PyDict_GetItemString
}
Myclass::test()
{
char buffer[150];
char *strP1 = (char *)"sys.path.append('";
char *strP2 = (char *)"')";
strcpy (buffer, strP1);
strcat (buffer, _modDir);
strcat (buffer, strP2);
printf("Before %s\n", _modDir);
printf("Before %s\n", _modName);
PyRun_SimpleString(buffer);
printf("After %s\n", _modName);
}
这是输出。仅供我使用a,b,c,d,f仅用于说明目的。它几乎像PyRun_SimpleString(缓冲区)一样填充缓冲区的末尾到_modName。
Before /aaa/bbb/ccc/ddd
Before ffffff
After cc/ddd'
答案 0 :(得分:0)
感谢Klamer Schutte暗示正确的方向。 我的代码中的DECRF是罪魁祸首。我想,对于参考的工作原理并不敏感。 DECREF调用释放了pValue以及_modName指向的内容。如果我在_modName赋值后添加了一个Py_INCREF(pValue),那么猜测会有更多的初学者问题吗?
_modName = PyString_AsString (PyDict_GetItemString(pValue, (char*)"modName"));
Py_DECREF(pValue);