Pyboof: как использовать оболочки python в java?

Я загрузил pyboof, которые являются оболочками python в java. Итак, мой вопрос в том, как именно я могу их использовать? Я написал простую программу, которая открывает командную оболочку и запускает оттуда оболочку. Моя программа указана выше:

package alltestshere;

import java.awt.image.BufferedImage;
import java.io.* ;

import boofcv.io.UtilIO;
import boofcv.io.image.UtilImageIO;

public class PythonCaller {

    public static void main (String [] args) throws IOException {



        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("cmd set PATH = C:\\Python27");
        Process pr2 = rt.exec("cmd python27 C:\\Users\\Caterina\\Downloads\\PyBoof-master\\PyBoof-master\\examples\\blur_image.py");
        Process pr3 = rt.exec("cmd blur_image.py");


        }
  }  

Но при запуске ничего не происходит. Я также пытаюсь запустить файл py "blur_image" в оболочке python, но он просто открывает файл, а я хочу посмотреть, как изменилось изображение (новое изображение). Итак, это неправильный способ использовать оболочки Python или мне нужно сделать что-то еще, чтобы использовать оболочки? Обертку blur_image можно найти здесь https://github.com/lessthanoptimal/PyBoof/blob/master/examples/blur_image.py.

Согласно их документации «PyBoof - это оболочка Python для библиотеки компьютерного зрения BoofCV. Поскольку это библиотека Java, вам необходимо установить java и javac». Другими словами, вы пытаетесь вызвать оболочку Python вокруг библиотеки Java из Java. Почему?! Просто используйте эту библиотеку BoofCV напрямую, поскольку это библиотека Java.

Mark Rotteveel 01.10.2018 19:22

Хорошо, большое спасибо!! Кажется, что-то не так!

Katerina Kornilia 02.10.2018 12:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
594
1

Ответы 1

Скрипт для запуска python из Java может выглядеть следующим образом:

String script = "C:\\Users\\Caterina\\Downloads\\PyBoof-master\\PyBoof-master\\examples\\blur_image.py";
String python_app = "python27"
Process pr = rt.exec(new String[]{python_app, script})

После запуска процесса вам нужно дождаться его завершения, выполнив следующие действия:

pr.waitFor()

Если ожидается, что сценарий напишет какой-то вывод или прочитает какой-то ввод, вам следует прочитать вывод и написать что-нибудь для ввода.

В следующем примере что-то записывается во входной поток подпроцесса:

BufferedWriter writer = new BufferedWriter(
    new OutputStreamWriter(p.getOutputStream()));

writer.write("something");
writer.newLine();
writer.close();

Тем не менее, PyBoof - это оболочка Python для библиотеки компьютерного зрения BoofCV (противоположное направление, от Python к вызову Java), как написано на странице GitHub, и вы можете использовать библиотеку BoofCV непосредственно из Java.

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

Mark Rotteveel 01.10.2018 19:29

Спасибо! Теперь у меня ошибка process = 2 (система не может найти указанный файл), и я работаю над этим. В любом случае, я просто пытаюсь понять, как использовать Java и Python одновременно, поэтому и попробовал.

Katerina Kornilia 02.10.2018 17:56

@KaterinaKornilia Отлично! вы можете также использовать среду вывода, известную Java. Я предпочитаю сначала настроить системную среду, добавив папку сценариев Python и Python.

Eir Nym 03.10.2018 11:41

Кроме того, вы можете попробовать посмотреть проект jPype, который более плавно соединяет Java и Python.

Eir Nym 03.10.2018 11:42

Спасибо, @Eir Nym! Я не могу использовать jPype, я пытаюсь установить его через pip в Python 2.7.15, но подходящего дистрибутива не найдено.

Katerina Kornilia 03.10.2018 18:19

@KaterinaKornilia Действительно, есть сборка Python3 в PyPI (с именем JPype1-py3). Могу я спросить, почему вам нужно использовать Python2 в 2018 году?

Eir Nym 04.10.2018 12:16

Потому что сначала я попробовал Jython, который несовместим с Python 3.x. Поскольку я работаю с двумя компьютерами, я попробую это сделать на другом, на котором у меня установлен Python 3.6, и расскажу вам.

Katerina Kornilia 04.10.2018 12:47

Я пробовал это через Anaconda3, и у меня не получилось, либо появилось то же сообщение «Не найдено подходящего распределения для jpype»

Katerina Kornilia 04.10.2018 13:55

Обновил мой ответ с улучшенной обработкой процесса

Eir Nym 04.10.2018 23:32

Другие вопросы по теме