belk_o
Июнь 28, 2010 23:50:34
Возник вопрос - какие способы передачи данных существуют?
Ситуация такая - есть программа, работающая в терминале (ядро) - к ней привешен гуй.
Какие правильные и неправильные способы обмена информацией между ними есть в природе?
1 Socket
2 subprocess - Pipe
3 raw_input()
4 dbus? - пока тёмный лес
5 потоки - они же нити - тоже недалеко от тёмного леса
Эксперты - подскажите какой метод наиболее правильный, может при этом выполняться в реальном времени (циклично) и самый простой?
Думаю эта тема будет актуальна для многих.
o7412369815963
Июнь 29, 2010 07:13:38
обычно оболочки над консольными прогами взаимодействуют через subprocess
Lexander
Июнь 29, 2010 10:01:51
Зависит от того, какими именно данными вы собираетесь обмениваться и какая связь между ядром и ГУИ вам нужна.
ilya1
Июнь 29, 2010 11:42:35
Если просто запускает консольную прогу, а последняя выполняется моментально, то suprocess.Popen() проще всего (и к PyGTK оно не привязано). Если же она выполняется долго, то для GUI-проги нужно организовать оповещение, когда приходят данные от консольной проги, чтобы не подвисать. В этом случае методы 1 и 4 подойдут, разница между ними - в API (ваш К.О.), а raw_input() вообще обертка на чтением для консольных программ (из стандартного ввода). 5 - не для передачи данных.
Какой проще,- 1 или 4, не знаю (пользовалcя ими из C++); Питон все с ног на голову перевернуть может в плане просто/сложно.
belk_o
Июнь 29, 2010 21:16:23
ilya1
Если просто запускает консольную прогу, а последняя выполняется моментально, то suprocess.Popen() проще всего (и к PyGTK оно не привязано). Если же она выполняется долго, то для GUI-проги нужно организовать оповещение, когда приходят данные от консольной проги, чтобы не подвисать. В этом случае методы 1 и 4 подойдут, разница между ними - в API (ваш К.О.), а raw_input() вообще обертка на чтением для консольных программ (из стандартного ввода). 5 - не для передачи данных.
Какой проще,- 1 или 4, не знаю (пользовалcя ими из C++); Питон все с ног на голову перевернуть может в плане просто/сложно.
Уже проясняется :)
Моя ситуация такая - консольная прога сбрасывает данные в постоянно обновляемый текстовый файл, а GUI постоянно считывает и выдаёт в случае изменений в файле новую информацию (обновляет)- в моём случае treeview. Я так понимаю - это не лучший способ?
Subprocess - он кроссплатформенный? Я пока в Linux - хотелось бы иметь возможность потом портировать под винь.
ilya1
Июнь 29, 2010 22:34:49
belk_o
Уже проясняется :)
Моя ситуация такая - консольная прога сбрасывает данные в постоянно обновляемый текстовый файл, а GUI постоянно считывает и выдаёт в случае изменений в файле новую информацию (обновляет)- в моём случае treeview. Я так понимаю - это не лучший способ?
Subprocess - он кроссплатформенный? Я пока в Linux - хотелось бы иметь возможность потом портировать под винь.
Subprocess - проще попробовать самому, там ничего сложного. Про обмен через файл - ищите API оповещения об изменении файлов
(тогда никакой передачи данных между прогами и не потребуется).
Андрей Светлов
Июнь 30, 2010 00:53:28
API - inotify для линукса и ReadDirectoryChanges для Windows. Оба заворачиваются через ctypes без проблем.
Помнится, были уже готовые обертки - гугль вам в помощь
belk_o
Июнь 30, 2010 13:07:50
Вот спасибо! pynotify - то, что надо!