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.
Ответ 2
Именованные каналы могут быть для вас ответом. Смотрите: Создайте временный FIFO (named pipe) в Python?
Ответ 3
Это решение с открытым исходным кодом, которое Google использует для IPC между Java и Python.
https://code.google.com/p/protobuf/
Рекомендуется.
Ответ 4
Используйте subprocess.Popen, чтобы запустить процесс Java и установить каналы для связи с ним. Для сериализации и десериализации данных эффективно в нейтральной по отношению к языку платформе нейтральный, расширяемый способ взгляните на Буферы протоколов (внесенный Jon Skeet!).
Ответ 5
У меня была аналогичная ситуация, когда мне приходилось общаться между процессом Java и процессом Linux. Я использовал именованные каналы.
Попробуйте реализацию mkfifo() в python.