IPC (взаимодействие между процессами) между python и java

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

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

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

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 и установить каналы для связи с ним. Для эффективной сериализации и десериализации данных на нейтральном языке, нейтральном для платформы, расширяемом способе взгляните на Протокол Буферы (вклад Джон Скит!).


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

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