2010-07-28 2 views
14

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

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

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

+0

Можете ли вы загрузить классы Java независимо от запуска графического интерфейса? –

+0

Да, у меня есть обертка с использованием JNI –

ответ

3

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

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

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

1

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

3

Named pipes может быть для вас ответом. См.: Create a temporary FIFO (named pipe) in Python?

+0

Hrm, это кажется легким из-за угла Python, но из того, что я читаю, Java сможет обрабатывать FIFO только как файлы и не сможет их создать независимый от ОС способ. Это должно быть хорошо для отправки изображений на Java, но я не уверен, хватит ли для их возврата. –

+0

FIFO зависят от платформы, и они фактически используются через файловые интерфейсы в UNIX (http://en.wikipedia.org/wiki/Named_pipe). Если вам неудобно с этим (или предпочитайте что-то, поддерживаемое стандартными библиотеками), вы можете просто использовать сокет. –

3

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

Рекомендован.

+0

это замечательно. Это сильно зависит от модели O-O, поэтому, возможно, это невозможно для C-подобных языков. Но он отвечает на этот вопрос +, используя сокеты для отправки сообщения. – ArmenB

0

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

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

Смежные вопросы