Python-скрипт OSError при вызове из среды выполнения Java - PullRequest
0 голосов
/ 18 марта 2019

У меня есть скрипт Python (назовите его python_prog.py), который выглядит так:

#!/usr/bin/env python

import tempfile
import subprocess

with tempfile.NamedTemporaryFile() as file:
    # populate file with data
    # then call another program, passing file.name as an arg:
    return subprocess.check_output([command_line_program, file.name, option1, option2])

Я могу позвонить python_prog.py по имени из командной строки:

$>  python_prog.py  option1 option2

Это работает просто отлично. Проблема заключается в попытке вызвать python_prog.py из Java-программы. Я использую Runtime.getRuntime().exec() в коде Java:

        String[] command = new String[] {
                "python_prog.py",
                "option1",
                "option2"
        };

        try {
            Process process = Runtime.getRuntime().exec(command);
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            StringBuilder builder = new StringBuilder();
            StringBuilder errorBuilder  = new StringBuilder();
            reader.lines().forEach(builder::append);
            error.lines().forEach(errorBuilder::append);
            String outputString = builder.toString();
            String errorString = errorBuilder.toString();
        catch(IOException e) {
            // do something
        }

Когда я запускаю этот фрагмент из Java, я получаю ошибку Python от вызова subprocess.check_output(). Значение строки errorString:

Traceback (most recent call last):
  File "python_prog.py", line 9, in __main__
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 566, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Я подозреваю, что где-то во вложенных оболочках временный файл недоступен, однако я не могу понять, почему.

Есть мысли здесь?

edit: Точный вызов подпроцесса python выглядит следующим образом:

def _exec_crf_test(input_text, model_path):
    with tempfile.NamedTemporaryFile() as input_file:
        input_file.write(utils.export_data(input_text))
        input_file.flush()
        return subprocess.check_output(
            ['crf_test', '--verbose=1', '--model', model_path, file.name]).decode('utf-8')
...