我正在将Python嵌入到我的C++中,并创建PyObjects来表示我的数据/对象( into、doubles、strings等等)。
为了找到上述问题的答案,我花了几个小时,我预计会有一个" name“属性或"name()”方法来设置,并引用Python脚本中使用的规范对象名称(作为全局/本地对象),这样就会有一个函数:
PyObject *PyObject_ByName(PyObject *PyObjs, char* name)返回值:新引用。是稳定ABI的一部分。从与“名称”匹配的PyObjs数组中返回一个新的PyObjs引用,如果失败,则返回NULL。
我遗漏了什么?我看到其他所有的东西都就位了。
MSEXPORT PyObject* PyVariant(VarObj* data, tLvVarErr* error) {
PyObject* module_name, * module, * dict, * python_class, * object;
PyObject *pValue = NULL; // <- what I want to set name
switch (data->data.index())
{
case VarIdx::I32:
pValue = PyLong_FromLong((long) get<int32_t>(data->data));
break;
case VarIdx::DBL:
pValue = PyFloat_FromDouble ((double) get<double>(data->data));
break;
case VarIdx::Str :
pValue = PyUnicode_FromString((char*) get<string*>(data->data)->c_str());
break;
default:
return NULL;
}
return pValue;
}发布于 2022-09-13 14:32:08
您需要知道的是Python名称空间是基于字典实现的(函数中的本地命名空间是例外)。全局名称查找只是为了获得全局名称空间字典并搜索字符串键。因此,您需要做的是:
PyEval_GetGlobals获取全局命名空间,PyUnicode_FromString通过C字符串构造字符串对象,PyDict_GetItem从全局命名空间获取对象。G 210
至于我在注释区域中提到的_PyDict_LoadGlobal,它是Python内部用来快速加载对象的API (从函数名称的下划线开始)。在编写C扩展时,应该避免使用它。
https://stackoverflow.com/questions/73704219
复制相似问题