IPC (inter process communication) между python и java


Во-первых, небольшое объяснение Почему я задаю этот вопрос в первую очередь: Я пишу программу на python (с графическим интерфейсом wxPython), которая должна вызывать программу JAVA AWT из python и извлекать из нее данные. У меня есть в процессе работы решение для Windows. У меня также есть внутрипроцессное решение на OSX, пока я запускаю приложение Java без головы. К сожалению, нет разумного решения, которое я нашел для запуска обоих GUI в рамках одного процесса на OSX, потому что оба AWT и WX оба хотят получить первый поток и не могут совместно использовать цикл сообщений wx.

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

Я был бы очень признателен за любые предложения или даже толчок в правильном направлении, поскольку у меня очень мало опыта работы с IPC.
5 14

5 ответов:

Это решение с открытым исходным кодом, которое Google использует для выполнения IPC между Java и Python. https://code.google.com/p/protobuf/

Рекомендуется.

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

Изучая программирование сокетов, я нашел фантастический ресурс здесь: https://web.archive.org/web/20080913064702/http://www.prasannatech.net/2008/07/socket-programming-tutorial.html

Учебник представлены TCP и UDP варианты простой чат-программы, написанной на 4 языках. В итоге я использовал и модифицировал клиент TCP Java и сервер Python.

Используйте подпроцесс .Popen , чтобы запустить процесс Java и установить каналы для связи с ним. Для эффективной сериализации и десериализации данных в нейтральном к языку, нейтральном к платформе, расширяемом способе взгляните на буферы протокола (внесенные вJon Skeet !).

У меня была похожая ситуация, когда я должен был общаться между процессом Java и процессом Linux. Я использовал именованные трубы.

Попробуйте реализовать mkfifo () в python.