Динамический ввод данных пользователем Python в отдельную программу на C - PullRequest
1 голос
/ 24 февраля 2012

У меня есть графический интерфейс Python, написанный на Tkinter. Основная цель программы - настроить множество различных переменных для окончательного расчета гиперспектрального изображения (география). Теперь разработаны некоторые дополнительные спецификации, в которых пользователь хотел бы иметь возможность активно вводить некоторые параметры для групп сглаживаемых пикселей. Эта информация будет вводиться в Python GUI, и программы C, которые обрабатывают изменения изображения, нуждаются в этом как входные данные. Поскольку изображения могут быть гигантскими, я хочу стараться избегать повторного запуска программы на C (которая включает выделение памяти, чтение гигантского файла и т. Д.) С помощью вызова, такого как

os.system(./my_C_Program param1 param2 param3....)

Я бы предпочел иметь систему, в которой после вызова my_C_Program она может находиться в состоянии ожидания после загрузки всех ресурсов в память. Я думал, что что-то, связанное с getchar(), будет тем, что я хочу, но я не знаю, как я могу получить вывод из Python для перехода на my_C_Program. Я видел несколько похожих вопросов по этому поводу на SO, но я не смог точно определить, как эти сценарии могли бы помочь мне.

Если getchar() ответ, может кто-нибудь объяснить, как работает stdout с несколькими открытыми терминалами?

Кроме того, я пытаюсь сделать эту программу легко мультиплатформенной в Linux / Mac / Windows.

Подводя итог, я хочу следующую функциональность:

  1. Пользователь выбирает определенный ввод из графического интерфейса Python
  2. Этот вход становится входом для программы на C
  3. Эта программа на C может обрабатывать больше входных данных без необходимости повторного запуска с самого начала (избегая файлового ввода-вывода и т. Д.).

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Первое, что вам, вероятно, следует сделать, это начать использовать модуль Python subprocess вместо os.system. После того, как вы это сделаете, вы можете изменить его так, чтобы stdin программы на C можно было писать в Python, а не наследовать stdin.

скрипта Python.

После этого вы можете просто заставить Python отправлять данные, которые программа C может интерпретировать. Например, вы можете использовать несколько блоков JSON, по одному на строку, например API потоковой передачи Twitter 1 ; скрипт Python создает словарь запросов, сериализует его с json.dump, а затем записывает новую строку. Программа на C читает строку, анализирует JSON и обрабатывает запрос.

1 После прочтения документации кажется, что их реализация немного сложнее. Вы можете принять, как они это делают, или просто сделать, как я описал.

3 голосов
/ 25 февраля 2012

icktoofay и JasonFruit предложили достойные подходы;Я собираюсь предложить кое-что, чтобы отделить две программы немного дальше.

Если вы пишете свою программу на C как сервер , который прослушивает запросы и отвечает с ответами на сокете TCP,вы можете легче менять клиентов, делать так, чтобы они поддерживали несколько одновременных клиентов, выполнять почти беспроблемное обновление клиентов или серверов без необходимости изменения другого, или вы могли бы переместить программу C на более мощное оборудование, не выполняя незначительных измененийконфигурации.

Как только вы откроете сокет прослушивания и подтвердите подключение, остальная часть вашей программы может продолжаться, как если бы вы просто взаимодействовали через стандартный ввод и стандартный вывод.Это работает достаточно хорошо, но вы можете предпочесть кодировать ваши данные в каком-то стандартизированном формате, например JSON или ASN.1 , что может сэкономить некоторую ручную обработку строк.

2 голосов
/ 24 февраля 2012

Не могли бы вы сделать что-нибудь с pexpect ? Это позволяет вам вводить данные в программу командной строки, ожидая от нее определенных запросов, прежде чем продолжить. Он также позволяет читать промежуточный вывод, чтобы вы могли реагировать на него по мере необходимости.

Если вы используете Windows (как я заметил из вашего комментария), вы можете попробовать winpexpect , что аналогично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...