java запустить скрипт python
Py4J – мост между Python и Java
Название Py4J можно встретить разве что в списке библиотек, используемых PySpark, но не стоит недооценивать данный инструмент, который обеспечивает совместную работу Python и Java. В этой статье будет кратко описана работа Py4J, рассмотрен пример использования и перечислены сильные и слабые стороны библиотеки. В конце будут описаны альтернативные способы связи Java и Python.
Py4J позволяет программам, работающим в интерпретаторе Python, динамически обращаться к объектам Java внутри JVM. Методы вызываются так, как если бы объекты Java находились в интерпретаторе Python, а доступ к коллекциям Java можно было получить с помощью стандартных методов коллекций Python. Py4J также позволяет программам Java вызывать объекты Python, но на этом возможности библиотеки не заканчиваются. Py4J позволяет создавать из Python классические коллекции Java, а именно Array, List, Set и Map. Также можно конвертировать Python коллекции в Java коллекции. Ещё из Python возможно реализовывать интерфейсы, которые описаны в Java.
Существует несколько альтернатив, например, Jython. В отличие от него, Py4J не выполняет код Python в JVM, поэтому при использовании Py4J можно работать со всеми библиотеками классического Cython. Ещё есть JPype, но Py4J не связывает потоки Python и Java, также он использует сокеты, а не JNI для связи с JVM.
Главным минусом Py4J является скорость передачи данных между Python и Java. Так как общение происходит посредством сокетов, передавать данные, размером больше чем несколько мегабайт, будет плохой идеей, для этой цели существуют другие решения. Главная задача Py4J – обеспечить доступ к объектам Java и сохранить возможность использования Python библиотек.
Пример работы
Для примера будет создано три Java класса и один Python скрипт для проверки работы. Класс Dict, в котором реализована логика работы с HashMap, Класс DictEntryPoint, в котором реализована точка входа, чтобы Python мог взаимодействовать с объектом класса Dict. Также нужен класс Program, в котором происходит запуск сервера.
Для успешной работы Py4J нужно настроить точку входа, в которой создать необходимые для работы объекты, и запустить GatewayServer, который обеспечивает связь Python с JVM через сокет локальной сети. Далее можно спокойно использовать Java код из Python.
Вывод должен быть примерно такой. После запуска Program.java можно приступить к написанию Python кода для подключения к JVM.
После запуска Application.py в консоль выводится следующее:
По ключу 0 находится элемент, добавленный из Java, а имена людей были добавлены с помощью Python.
Заключение
Py4J позволяет быстро и легко взаимодействовать с объектами Java из Python, организовывать двустороннее управление коллекциями и работать с интерфейсами в двух языках, соединяя интерпретатор и JVM сокетами. Он отлично подойдёт для задач, требующих минимальных ограничений на использование Python, но при этом не отличается высокой производительностью.
На правах рекламы
VDSina предлагает быстрые серверы в аренду под любые задачи, огромный выбор операционных систем для автоматической установки, есть возможность установить любую ОС с собственного ISO, удобная панель управления собственной разработки и посуточная оплата.
Вызов и получение вывода из скрипта Python на Java?
каков самый простой способ выполнить скрипт Python из Java и получить вывод этого скрипта? Я искал разные библиотеки, такие как Jepp или Jython, но большинство из них устарели. Другая проблема с библиотеками заключается в том, что мне нужно иметь возможность легко включить библиотеку с исходным кодом (хотя мне не нужно источник для самой библиотеки), если я использую библиотеку.
из-за этого самый простой / самый эффективный способ-просто сделать что-то вроде вызова скрипт со средой выполнения.exec, а затем как-то захватить печатный вывод? Или, хотя это было бы очень болезненно для меня, я также мог бы просто вывести скрипт Python во временный текстовый файл, а затем прочитать файл на Java.
Примечание: фактическая связь между Java и Python не является требованием проблемы, которую я пытаюсь решить. Это, однако, единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
8 ответов
не уверен, правильно ли я понимаю ваш вопрос, но при условии, что вы можете вызвать исполняемый файл Python из консоли и просто хотите захватить его вывод на Java, вы можете использовать exec() метод в Java Runtime класса.
вы можете прочитать о том, как на самом деле читать выход здесь:
существует также библиотека Apache (проект Apache exec), которая может помочь вам с этот. Подробнее об этом можно прочитать здесь:
вы можете включить языка Jython библиотека в вашем проекте Java. Ты можешь!—8—>скачать исходный код из самого проекта Jython.
Jython делает предлагает поддержку для JSR-223 который в основном позволяет запускать скрипт Python С Java.
можно использовать ScriptContext чтобы настроить, куда вы хотите отправить вывод выполнения.
например, предположим, что у вас есть следующий скрипт Python в файле имени numbers.py :
Итак, вы можете запустить его с Java следующим образом:
пока ваш скрипт Python совместим с Python 2.5, у вас не будет проблем с запуском этого с Jython.
я столкнулся с той же проблемой раньше, также прочитал ответы здесь, но не нашел никакого решения, которое могло бы сбалансировать совместимость, производительность и форматирование, Jython не может работать с пакетами extend C и медленнее, чем CPython. Поэтому, наконец, я решил изобрести колесо сам, это заняло мои 5 ночей, я надеюсь, что это может помочь вам тоже: jpserve (https://github.com/johnhuang-cn/jpserve).
JPserve предоставляет простой способ вызвать Python и обменять результат на ну формат JSON, немного потери производительности. Ниже приведен пример кода.
сначала запустите jpserve на стороне Python
затем вызовите Python со стороны JAVA:
Я искал разные библиотеки, такие как Jepp или Jython, но большинство из них, похоже, очень устарели.
Jython не является «библиотекой»; это реализация языка Python поверх виртуальной машины Java. Он определенно не устарел; самым последним релизом был февраль. 24 этого года. Он реализует Python 2.5, что означает, что вам будет не хватать нескольких более поздних функций, но он, честно говоря, не сильно отличается от 2.7.
Примечание: фактическая связь между Java и Python не является требованием вышеупомянутого задания, поэтому это не делает мою домашнюю работу для меня. Это, однако, единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
Это кажется очень маловероятно для школьного задания. Пожалуйста, расскажите нам больше о том, что вы действительно пытаюсь сделать. Обычно в школьных заданиях указывается, какие именно языки вы будете использовать для чего, и я никогда не слышал о том, что включало более одного языка вообще. Если бы это было так, они бы сказали вам, если вам нужно установить такой вид связи, и как они намеревались это сделать.
подход языка Jython
Java должна быть независимой от платформы, и вызов собственного приложения (например, python) не очень независим от платформы.
существует версия Python (Jython), написанная на Java, которая позволяет нам вставлять Python в наши Java-программы. Как обычно, когда вы собираетесь использовать внешние библиотеки, одним из препятствий является компиляция и корректное ее выполнение, поэтому мы проходим процесс создания и запуска простой Java-программа с Jython.
мы начнем с получения файла Jython jar:
Я скопировал jython-2.5.3.jar в каталог, где будет моя Java-программа. Затем я набрал следующую программу, которая делает то же самое, что и предыдущие два; возьмите два числа, отправьте их на python, который добавляет их, затем python возвращает его обратно в нашу Java-программу, где число выводится на экран:
Я называю этот файл » test3.java», сохраните его и выполните следующие действия для его компиляции:
javac-classpath jython-2.5.3.jar test3.java
следующий шаг-попытаться запустить его, что я и делаю следующим образом:
java-classpath jython-2.5.3.сосуд.: test3
теперь это позволяет нам использовать Python из Java независимо от платформы. Это довольно медленно. Тем не менее, это круто, что это интерпретатор Python, написанный в Ява.
Вызов python3 скрипта из java?
Пользуюсь на домашнем сервачке для скачки торрентов uTorrent for Linux.
Он имеет один большой (для меня) недостаток — в нем нет возможности определить, в какую папку загружать данный конкретный торрент.
Есть скрипт на python3, который помогает решить эту задачу.
Здесь находится ветка его обсуждения.
Хотел написать к нему небольшую десктопную морду, в которой можно будет ввести абсолютный путь на сервере, куда сохранять, выбрать торрент, который скачивать и вводить логин-пароль для сервера.
Столкнулся с тем, что не знаю, как вызывать питонский скрипт из джавы.
Скажите, а почему может не работать?
Практически точно скопировал ваш код, только команда вызывается у меня:
Скрипт выдает ответ «UNAUTHORIZED»
Когда ту же команду пишу в консоли — все прекрасно отрабатывает…
Если это не поможет, тогда я уж не знаю в чем дело.
Вызывать и получать вывод из скрипта Python на Java?
Какой самый простой способ выполнить скрипт Python из Java и получить выходные данные этого скрипта? Я искал разные библиотеки, такие как Jepp или Jython, но большинство из них устарели. Другая проблема с библиотеками заключается в том, что мне нужно иметь возможность легко включать библиотеку с исходным кодом (хотя мне не нужен источник для самой библиотеки), если я использую библиотеку.
Из-за этого самый простой / эффективный способ состоит в том, чтобы просто сделать что-то вроде вызова скрипта с помощью runtime.exec, а затем каким-то образом перехватить вывод на печать? Или, хотя это было бы очень болезненно для меня, я мог бы просто сделать вывод сценария Python во временный текстовый файл, а затем прочитать файл на Java.
Примечание: фактическое взаимодействие между Java и Python не является требованием проблемы, которую я пытаюсь решить. Это единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
10 ответов
Вы можете прочитать о том, как на самом деле прочитать вывод здесь:
Существует также библиотека Apache (проект Apache exec), которая может помочь вам в этом. Вы можете прочитать больше об этом здесь:
Вы можете включить библиотеку Jython в свой проект Java. Вы можете загрузить исходный код из самого проекта Jython.
Jython предлагает поддержку JSR-223, которая в основном позволяет запускать скрипт Python из Java.
Например, предположим, у вас есть следующий скрипт Python в файле с именем numbers.py :
Итак, вы можете запустить его из Java следующим образом:
Пока ваш Python-скрипт совместим с Python 2.5, у вас не возникнет никаких проблем при запуске этого с Jython.
JPserve предоставляет простой способ вызова Python и обмена результатами путем форматирования JSON, что приводит к небольшому снижению производительности. Ниже приведен пример кода.
Сначала запустите jpserve на стороне Python
Затем вызовите Python со стороны JAVA:
Сначала я бы порекомендовал использовать ProcessBuilder (начиная с 1.5)
Простое использование описано здесь
https://stackoverflow.com/a/14483787
Для более сложного примера обратитесь к
http: // www. javaworld.com/article/2071275/core-java/when-runtime-exec—won-t.html
Я столкнулся с проблемой при запуске скрипта Python из Java, скрипт выдавал слишком много выходных данных для стандартного вывода, и все пошло плохо.
Я искал разные библиотеки, такие как Jepp или Jython, но большинство, кажется, очень устарели.
Примечание: фактическое взаимодействие между Java и Python не является обязательным требованием вышеупомянутого назначения, поэтому это не делает мою домашнюю работу для меня. Это единственный способ, который я могу придумать, чтобы легко выполнить то, что нужно сделать.
Это кажется чрезвычайно маловероятным для школьного задания. Пожалуйста, расскажите нам больше о том, что вы действительно пытаетесь сделать. Обычно школьные задания точно определяют, какие языки вы будете использовать для чего, и я никогда не слышал о том, чтобы в нем было больше одного языка. Если это произойдет, они скажут вам, нужно ли вам устанавливать такой тип связи, и как они намеревались это сделать.
Подход Jython
Предполагается, что Java не зависит от платформы, а вызов нативного приложения (например, python) не очень зависит от платформы.
Существует версия Python (Jython), написанная на Java, которая позволяет нам встраивать Python в наши Java-программы. Как обычно, когда вы собираетесь использовать внешние библиотеки, одним из препятствий является компиляция и корректная работа, поэтому мы проходим процесс создания и запуска простой Java-программы с Jython.
Мы начнем с получения jar-файла jython:
Я скопировал jython-2.5.3.jar в каталог, где должна была быть моя Java-программа. Затем я набрал следующую программу, которая делает то же самое, что и две предыдущие; взять два числа, отправить их в python, который добавляет их, затем python возвращает их обратно в нашу программу Java, где число выводится на экран:
Я называю этот файл «test3.java», сохраняю его и делаю следующее для его компиляции:
ProcessBuilder очень прост в использовании.
Это должно вызвать Python. Обратитесь к процессуальному подходу здесь для полного примера!
Вы можете попробовать использовать Groovy. Он работает на JVM и обладает отличной поддержкой для запуска внешних процессов и извлечения выходных данных:
В этом коде по той же ссылке вы можете видеть, как groovy позволяет легко получить статус процесса:
Здесь представлен общий исходный код небольшого, но полного POC, который решает еще одну проблему в этом пост ;
Как вызвать Python Из Java
Изучите наиболее распространенные способы вызова кода Python из Java.
1. Обзор
Python становится все более популярным языком программирования, особенно в научном сообществе из-за его богатого разнообразия числовых и статистических пакетов. Поэтому нет ничего необычного в том, чтобы иметь возможность вызывать код Python из наших Java-приложений.
В этом уроке мы рассмотрим некоторые из наиболее распространенных способов вызова кода Python из Java.
2. Простой Скрипт На Python
В этом уроке мы будем использовать очень простой скрипт на Python, который мы определим в специальном файле с именем hello.py :
Предполагая, что у нас есть работающая установка Python, при запуске нашего скрипта мы должны увидеть напечатанное сообщение:
3. Ядро Java
В этом разделе мы рассмотрим два различных варианта, которые мы можем использовать для вызова нашего скрипта Python с использованием ядра Java.
3.1. Использование ProcessBuilder
Давайте сначала рассмотрим, как мы можем использовать API ProcessBuilder для создания собственного процесса операционной системы для запуска python и выполнения нашего простого сценария:
Как уже упоминалось ранее, мы сделали предположение, что питон команда доступна через ПУТЬ переменная.
3.2. Работа Со Скриптовым Движком JSR-223
Аналогично, он также может быть загружен и установлен напрямую.
Давайте перечислим все скриптовые движки, которые у нас есть в наличии:
Если у нас есть возможность использовать Jython, мы должны увидеть соответствующий скриптовый движок:
Теперь, когда мы знаем, что можем использовать скриптовый движок Jython, давайте продолжим и посмотрим, как вызвать hello.py скрипт:
Как и прежде, последний шаг-получить выходные данные из нашего скрипта и проверить, соответствует ли он тому, что мы ожидали.
4. Джайтон
Продолжая работу с Jython, у нас также есть возможность встраивать код Python непосредственно в наш Java-код. Мы можем сделать это с помощью класса Pythoninterpreter :
Использование класса PythonInterpreter позволяет нам выполнить строку исходного кода Python с помощью метода exec /. Как и прежде, мы используем StringWriter для захвата выходных данных этого выполнения.
Теперь давайте рассмотрим пример, где мы складываем два числа вместе:
В этом примере мы видим, как мы можем использовать метод get для доступа к значению переменной.
В нашем последнем примере Jython мы увидим, что происходит, когда возникает ошибка:
Несколько моментов, которые мы должны отметить:
5. Apache Commons Exec
Артефакт commons-exec доступен в Maven Central :
Теперь давайте посмотрим, как мы можем использовать эту библиотеку:
Подводя итог, можно сказать, что основная философия этой библиотеки заключается в том, чтобы предложить пакет выполнения процессов, направленный на поддержку широкого спектра операционных систем с помощью согласованного API.
6. Использование HTTP для взаимодействия
Давайте сделаем шаг назад на мгновение и вместо того, чтобы пытаться напрямую вызывать Python, рассмотрим использование хорошо зарекомендовавшего себя протокола, такого как HTTP, в качестве уровня абстракции между двумя разными языками.
На самом деле Python поставляется с простым встроенным HTTP-сервером, который мы можем использовать для обмена контентом или файлами по HTTP :
Как только у нас есть конечная точка, к которой мы можем получить доступ, мы можем использовать любую из нескольких библиотек Java HTTP для вызова нашей реализации веб-службы/приложения Python.
7. Заключение
В этом уроке мы узнали о некоторых из самых популярных технологий для вызова кода Python из Java.