У меня есть скрипт 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')