如何访问Python中编译的多个返回变量

How to access the multiple return variables compiled in python

本文关键字:编译 变量 返回 Python 何访问 访问      更新时间:2023-10-16

我是编程的新手,我在c 中定义了一个函数,带有元组方法,用于两个返回的变量,在我编译文件后,在python文件中,我尝试访问两个返回的变量在已编译的动态库中,但它不起作用,当我尝试运行Python程序时,发生了分割错误。但是我实际上是从C 的单个返回变量成功的成功,我认为从Python访问两个返回的变量可能会有特殊的技巧。

以下是带有元组方法的两个返回变量的C 代码

std::tuple<double, double> Cassie2d::Step(ControllerTorque* action)
{
  dyn_model_.setState(mj_data_->qpos, mj_data_->qvel);
  dyn_state_.UpdateDynamicState(&dyn_model_);
  mju_copy(mj_data_->ctrl, action->torques, nU);
  mj_step(mj_model_, mj_data_);
  return std::make_tuple(mj_data_->qacc,mj_data_->time);
  Render();
}

以下是应用Python方法,由于两个返回的变量都是双型。

lib.StepTorque.argtypes = [ctypes.c_void_p, ctypes.POINTER(ControllerTorque)]
lib.StepTorque.restype = ctypes.c_double

我猜restype不仅等于ctypes.c_double,因为它适用于一个返回的变量,并且可能对两个返回变量不起作用。

真的很感谢您的帮助!

使用 return std::make_tuple(mj_data_->qacc,mj_data_->time)创建一个结构,该结构容纳两个变量,在括号中定义。如果将来自本机C 代码调用该函数,则应该可以使用std:tie,等式:

对其进行打包。
double a, b;
std::tie(a,b) = Step(arg);

但是,您需要直接从Python调用它,该语法完全不同,用于返回多个变量(C 对或元组是旁路缺少功能)。我在Python中看到了两个选项。

  1. 将您的C 函数两个回调给Python,并以这种方式分别发送变量:

    void Cassie2d::Step(ControllerTorque* action, callback1, callback2)
    {
    dyn_model_.setState(mj_data_->qpos, mj_data_->qvel);
    dyn_state_.UpdateDynamicState(&dyn_model_);
    mju_copy(mj_data_->ctrl, action->torques, nU);
    mj_step(mj_model_, mj_data_);
    callback1(mj_data_->qacc);
    callback2(mj_data_->time);
    Render();
    }
    
  2. (建议)您可以尝试使用本机Python选项来服务多重返回。剩下的C 功能以其初始形式,然后以Python致电:

    VarA, VarB = Step(action)
    

    我假设您在Python代码中对Cassie2d::Step(ControllerTorque* action)方法有参考,但是您提供了很小的片段。