【发布时间】: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 放入循环中时,代码工作正常。你有什么线索吗?