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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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