Выполнить класс java из python с внешней банкой и несколькими аргументами

Я пытаюсь создать скрипт для выполнения класса java с передачей образца данных и получением результата из java. Java-код использует внешний jar, который уже находится на том же пути, что и мой файл python и файл java.

мой скрипт на питоне:

import os.path,subprocess
from subprocess import STDOUT,PIPE

def compile_java(java_file):
    subprocess.check_call(['javac', '-cp', 'commons-codec-1.7.jar', java_file])

def execute_java(java_file,args):
    java_class,ext = os.path.splitext(java_file)
    cmd = ['java', '-cp', 'commons-codec-1.7.jar', java_class]
    proc = subprocess.Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
    stdout,stderr = proc.communicate(args)
    print(stdout)
compile_java('jf.java')
execute_java('jf.java',[1,2])

мой пример класса Java:

import org.apache.commons.codec.binary.Base64;
public class jf {

    public static void main(String[] args) {

        System.out.println(args[0]);

    }
}

но я получил ошибки при компиляции:

b'Error: Could not find or load main class jf\n'

Я думаю, что проблема заключается в передаче args основной функции, и как я могу вернуть значение из java, в то время как основная функция является функцией void?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
0
267
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, что этот код должен работать:

cmd = ['java', java_class, 'InputString']

мне нужно передать список, а не строку, я пытался передать список или даже строку в cmd, но все та же проблема

Mostafa Mohamed 22.05.2019 15:16
Ответ принят как подходящий

Вы указываете путь к классу java через параметр -cp. Java будет искать класс jf в указанных файлах и не найдет его:

> java -cp commons-codec-1.7.jar jf toot
Error: Could not find or load main class jf

commons-codec здесь действительно не нужно. Вы можете напрямую использовать имя класса:

> java jf toot
toot

Или добавьте . к пути к классам, если вашему реальному коду нужны дополнительные jar-файлы:

> java -cp commons-codec-1.7.jar;. jf toot
toot

В вашем питоне:

cmd = ['java', '-cp', 'commons-codec-1.7.jar;.', java_class]

Один дополнительный момент: поскольку вам нужно передавать аргументы, я бы не использовал proc.communicate, поскольку он отправляет данные на стандартный ввод (вам нужно использовать что-то вроде сканера на стороне java), а просто добавляет args к вам cmd массив:

cmd = ['java', '-cp', 'commons-codec-1.7.jar;.', java_class] + args

Обратите внимание, что этот код предназначен для окон. В Linux разделителем является : для элементов пути к классам.

Paul Bombarde 22.05.2019 15:44

Большое спасибо, теперь это работает, но что касается вывода, который дал мне java, я использую system, out.println для получения вывода из java, но есть ли другой способ лучше собирать выходные данные из java?

Mostafa Mohamed 22.05.2019 15:56

Вы в основном пытаетесь установить межпроцессное общение. Многие назвали бы это удаленным вызовом процедур (RPC). Самый простой способ сделать это, используя аргументы, стандартный ввод и стандартный вывод. Для одноразовых процессов этого, безусловно, более чем достаточно. Для длительных процессов вы можете попытаться использовать связь через сокеты, но это действительно более сложно.

Paul Bombarde 23.05.2019 18:09

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