Ранее я создавал тему с вопросом: как получить результат работы скрипта Pyhton 3 в память при вызове через Python C-API (libpython). Это успешно удалось решить: после завершения работы программы получаем unicode-строку. Запускаю в отдельном QThread. Код привожу ниже.
Теперь же стала задача: нужно получать от скрипта если не вывод stdout, то хотя бы периодически одно число, а именно процент выполнения. Т.е. скрипт выполняется долго, но сам скрипт знает что он выполнил 67% работы. Надо как-то «наверх» передать.
Как можно это сделать? Какие-то экзепшены, колбэки, может представить всё выполнение как генератор и периодически дергать yield на каждый процент работы? А может получить указатель на PyObject куда скрипт кладет проценты и дергать раз в секунду, будет ли это потокобезопасно. Не представляю пока как.
void c_py::slot_py(QString py)
{
QString _redirect =
"import sys\n\
class _redirect:\n\
def __init__(self):\n\
self.value = ''\n\
def write(self, text):\n\
self.value += text\n\
redirect = _redirect()\n\
sys.stdout = redirect\n\
sys.stderr = redirect\n";
Py_Initialize();
PyObject *module = PyImport_AddModule("__main__");
PyRun_SimpleString(_redirect.toLatin1().data());
PyRun_SimpleString(py.toUtf8().data());
PyRun_SimpleString("sys_stdout = redirect.value");
PyObject *_out = PyObject_GetAttrString(module, "sys_stdout");
char *c_str = PyUnicode_AsUTF8(_out);
QString out = QString(c_str);
Py_Finalize();
sig_py(out);
}