【问题标题】:Fail calling PyObject_CallObject() for the second time第二次调用 PyObject_CallObject() 失败
【发布时间】:2019-08-06 18:55:07
【问题描述】:

我有一个 CPP 项目,它应该使用 python 脚本中的一些函数。当我第一次运行代码 PyObject_CallObject() 时工作​​正常(这是在循环内),但在第二次调用中它返回 null。 我知道我的代码可能效率低下或不专业,但我的问题是为什么 PyObject_CallObject() 在循环内第二次调用时会失败。 我将代码的相关部分表示如下。

Py_Initialize();
string Python_file_name1 = "Main_Test";
PyObject* myModuleString1 = PyUnicode_DecodeFSDefault(Python_file_name1.c_str());
if (myModuleString1 == NULL) {
    cout << "unable to get python file name ";
    return 1;
}
PyObject* myModule1 = PyImport_Import(myModuleString1);
if (myModule1 == NULL) {
    cout << "unabale to import python module";
    return 1;
}      
PyObject* myFunction1 = PyObject_GetAttrString(myModule1, (char*)"model_forecast");
PyObject* myResult1;
PyObject* args2;
PyObject* pXVec; 
float CurrentStep = 1;
vector<float> v2 = VectorXf::Zero(96);
for (int j =0; j<10; j++){
    pXVec = PyTuple_New(v2.size());
    for (int i = 0; i < v2.size(); ++i) {
        pValue = PyFloat_FromDouble(v2[i]);
        if (!pValue) {
            Py_DECREF(pXVec);
            fprintf(stderr, "Cannot convert array value\n");
            return 1;
        }
        PyTuple_SetItem(pXVec, i, pValue);
    }
    args2 = PyTuple_Pack(2, pXVec, PyFloat_FromDouble((double)CurrentStep));
    myResult1 = PyObject_CallObject(myFunction1, args2);
    vector<float> DL_Load_forecst;
    DL_Load_forecst = listTupleToVector_float(myResult1);
}

Py_DECREF(args2);
Py_DECREF(myResult1);
Py_DECREF(myModuleString1);
Py_DECREF(myFunction1);
Py_DECREF(pXVec);   
Py_Finalize();

python代码是

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = '-1'
import numpy as np
import keras.backend as K
from keras.models import load_model
model_name = 'forecast_model_final.h5'
model = load_model(model_name)
model.summary()

def model_forecast(x, st_time):
    st_time = int(st_time)
    x = np.reshape(x, (1,-1))
    x_curr = np.zeros((1,96))
    if st_time != 0: x_curr[:,0:st_time] = x[:, -st_time:]
    x = np.roll(x, [0,st_time])
    x = x.reshape((1,96,7,4), order='F')
    y_pred = model.predict([x, x_curr], verbose=0)[:, st_time:st_time+96]
    y_pred_L = y_pred.tolist()
    return y_pred_L

【问题讨论】:

  • Python函数的代码是什么?
  • 真正的python代码是深度学习神经网络,但为了测试我把它改成了返回pXVec。
  • 我添加了python代码
  • def model_forecast(x, st_time): return [1.0, 2.0] 开始——没有导入,也没有破坏环境。
  • @molbdnilo 当我将所有 Py 对象初始化和 DECREF 放入循环中时,代码工作正常。你有什么线索吗?

标签: python c++ embedding


【解决方案1】:

感谢@molbdnilo,我发现了问题,

y_pred_L = y_pred.tolist()

应该改为

y_pred_L = y_pred.reshape((-1,)).tolist()

鉴于 listTupleToVector_float 函数的定义,这显然是我的错误。 但是,我不知道为什么函数在第一次调用时执行没有错误!!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 2021-04-02
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多