LINUX.ORG.RU

Получать числа от скрипта по мере выполнения

 , ,


0

2

Ранее я создавал тему с вопросом: как получить результат работы скрипта 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);
}

hizel Virtuos86

Ответ на: комментарий от vvn_black

Спасибо, интересненько, хороший вариант. Хотя наверное это пушковоробьиный способ.

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
Ответ на: комментарий от hizel
import socket
def progress(pc):
	text = "%10d" % int(pc)
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	sock.connect(("localhost", 25010))
	res = sock.send(text.encode("utf-8"))
	sock.close()

Да, может это не изящно с точки зрения уровня владения libpython, но оказалось рабочим временным решением.

I-Love-Microsoft ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.