Запустите скрипт python (с зависимостью numpy) из java

#java #python #numpy #jython

#java #python #numpy #jython

Вопрос:

В приложении Java мне нужно использовать определенный алгоритм обработки изображений, который в настоящее время реализован на python. Каков был бы наилучший подход, зная, что этот скрипт использует библиотеку Numpy?

Я уже пытался скомпилировать скрипт на Java с помощью компилятора jythonc, но, похоже, он не поддерживает зависимости от собственных библиотек, таких как Numpy. Я также пытался использовать Jepp, но при импорте Numpy я также получаю ImportError.

Есть предложения?

Ответ №1:

Если вы используете Numpy, вам, вероятно, придется просто использовать C Python, поскольку это скомпилированное расширение. Я бы рекомендовал сохранить изображение на диск, возможно, как временный файл, а затем вызвать Python как подпроцесс. Если вы имеете дело с двоичными данными, вы можете даже попробовать сопоставить данные в памяти на Java и передать путь к подпроцессу.

В качестве альтернативы, в зависимости от ваших обстоятельств, вы можете настроить простой сервер обработки данных на Python, который принимает запросы и возвращает обработанные данные.

Ответ №2:

Хотя ответ Джо может быть простым, у вас возникнут проблемы с производительностью, если изображение большое (2 полных записи и чтения). Я не эксперт по Java, но согласно http://wiki.cacr.caltech.edu/danse/index.php/Communication_between_Java_and_Python#Communication_through_bindings , вы можете разработать привязки c <—> java. Вы можете сделать то же самое с python (с помощью ctypes или cython, если вы не хотите изучать python c api).

С их помощью вы можете создать себе хороший python <—> java bridge на c и передать указатель на данные изображения (что будет быстрее, чем запись и чтение его на жестком диске).

Комментарии:

1. Вы предлагаете передать указатель на буфер памяти в процессе Java в собственную функцию Python? Вы уверены, что сможете это сделать? И, черт возьми, API Python C не может быть лучше!

2. Как я уже сказал, я не разработчик Java и не очень хорошо знаю платформу. Я знаю, что API python C хорош, как и API numpy. Но чтобы написать расширение python C для обработки массива numpy, Cython намного проще в освоении.

Ответ №3:

Для использования numpy в процессе Java Jep теперь поддерживает numpy. Вы также можете использовать jpy или JyNI.

С помощью этих библиотек вы могли бы передавать изображения между Java и Python в виде байтовых массивов и ndarrays при выполнении своих вычислений.