Я новичок в tenorflow, а также включаю код на Python в C ++, поэтому я бы оценил любые советы / комментарии по поводу следующего странного поведения:
У меня есть Python-интерфейс класса C ++ с заголовочным файлом pythoninterface.h
:
#include <string>
#include <iostream>
class pythoninterface{
private:
const char* file;
const char* funct;
const char* filepath;
public:
pythoninterface();
~pythoninterface();
void CallFunction();
};
Исходный файл pythoninterface.cpp
:
#include <Python.h>
#include <string>
#include <sstream>
#include <vector>
#include "pythoninterface.h"
pythoninterface::pythoninterface(){
file = "TensorflowIncludePy";
funct = "myTestFunction";
filepath = "/path/To/TensorflowIncludePy.py";
}
void pythoninterface::CallFunction(){
PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *presult;
// Initialize the Python Interpreter
Py_Initialize();
//Set in path where to find the custom python module other than the path where Python's system modules/packages are found.
std::stringstream changepath;
changepath << "import sys; sys.path.insert(0, '" << filepath << "')";
const std::string tmp = changepath.str();
filepath = tmp.c_str();
PyRun_SimpleString (this->filepath);// Build the name object
pName = PyString_FromString(this->file);
// Load the module object
pModule = PyImport_Import(pName);
if(pModule != NULL) {
// pDict is a borrowed reference
pDict = PyModule_GetDict(pModule);// pFunc is also a borrowed reference
pFunc = PyDict_GetItemString(pDict, this->funct);
if (PyCallable_Check(pFunc))
{
pValue=Py_BuildValue("()");
printf("pValue is empty!\n");
PyErr_Print();
presult=PyObject_CallObject(pFunc,pValue);
PyErr_Print();
} else
{
PyErr_Print();
}
printf("Result is %d!\n",PyInt_AsLong(presult));
Py_DECREF(pValue);
// Clean up
Py_DECREF(pModule);
Py_DECREF(pName);
}
else{
std::cout << "Python retuned null pointer, no file!" << std::endl;
}
// Finish the Python Interpreter
Py_Finalize();
}
И файл Python, из которого должна быть включена функция (TensorflowIncludePy.py
):
def myTestFunction():
print 'I am a function without an input!'
gettingStartedTF()
return 42def gettingStartedTF():
import tensorflow as tf #At this point the error occurs!
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
return 42
Наконец, в моей основной функции я создаю только pythoninterface
объект p
и вызвать функцию p.CallFunction()
, Связь между C ++ и Python-кодом работает нормально, но когда (во время выполнения) строка import tensorflow as tf
достигнуто, я получаю *** stack smashing detected ***
сообщение об ошибке и программа заканчивается. Кто-нибудь может угадать, в чем проблема или была похожая проблема раньше?
Я знаю, что есть API-интерфейс tenorflow c ++, но я чувствую себя более комфортно с использованием tenorflow в python, поэтому я подумал, что это может быть идеальным решением для меня (по-видимому, это не так …: P)
Задача ещё не решена.
Других решений пока нет …