gpt4 book ai didi

c++ - 如何使用 PyObject_CallObject 查询复杂返回类型的数据?

转载 作者:行者123 更新时间:2023-11-28 06:50:32 25 4
gpt4 key购买 nike

我有一个计算二维位置的小​​ python 程序

def getPosition(lerpParameter):
A = getClothoidConstant()
...

python 脚本可以在我的项目文件夹中找到here .

函数 getPosition 包含在文件 clothoid.py 中.该函数返回一个 Vector2 类型的值。如何在我的 C++ 程序中访问返回的 Vector2d 的数据?

C++ 程序如下所示:

    /// Get function
PyObject *pFunc = PyObject_GetAttrString(pModule, pid.functionName);
// pFunc is a new reference

if (pFunc && PyCallable_Check(pFunc))
{
PyObject *pArgs = PyTuple_New(pid.getArgumentCount());

PyObject *pValue = nullptr;

// setup function parameters
for (int i = 0; i < pid.getArgumentCount(); ++i)
{
if (pid.arguments[i].type == eType::Int)
{
pValue = PyLong_FromLong(atoi(pid.arguments[i].name.c_str()));
}
else
{
pValue = PyFloat_FromDouble(atof(pid.arguments[i].name.c_str()));
}

if (!pValue)
{
Py_DECREF(pArgs);
Py_DECREF(pModule);
std::cout << "Cannot convert argument" << std::endl;
throw std::runtime_error("Cannot convert argument");
}
// pValue reference stolen here:
PyTuple_SetItem(pArgs, i, pValue);
}

pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs);

if (pValue != nullptr)
{
switch (pid.returnType)
{
...

case eType::Double:
//std::cout << "Result of call: " << PyFloat_AsDouble(pValue) << std::endl;
doubleValue_ = PyFloat_AsDouble(pValue);
break;

case eType::Vector2d:
{
// How can I acccess the data here?

}
break;

default:
break;
}

Py_DECREF(pValue);
}

如果返回类型是 double 或 int 很容易得到对应的值。但是我不知道如何访问 Vector2 的数据。

最佳答案

如果你想获取 'x' 属性,并且你知道它是一个 float :

PyObject *temp = PyObject_GetAttrString(pValue, "x");
if (temp == NULL) {
// error handling
}
double x = PyFloat_AsDouble(temp);

// clean up reference when done with temp
Py_DECREF(temp);

关于c++ - 如何使用 PyObject_CallObject 查询复杂返回类型的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24042207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com