Ошибка при вызове python скрипта из Runtime

121
17 октября 2019, 06:10

Необходимо по команде выполнить запуск python скрипта. Не использовал jython т.к. скрипт содержит библиотеку todoist-api. Запуск скрипта выполняется по команде:

try {
        String cmd = "/home/kiryushin/projects/python/stm/venv/lib/stmtest1.py";
        Process p = Runtime.getRuntime().exec(cmd);
    }
    catch (IOException e){e.printStackTrace();} 

на что получаю исключение -

" java.io.IOException: Cannot run program "/home/kiryushin/projects/python/stm/venv/lib/stmtest1.py": error=13, Отказано в доступе"

Менял параметры доступа в том числе через chmod -r 777. OC Ubuntu 18.04 lts.

Answer 1

По комментариям стало ясно, что проблема запуска - не найден интерпретатор python.

Одного chmod +x [имя скрипта] недостаточно, чтобы сделать файл исполняемым. Точнее сказать: правильно исполняемым.

Варианты решения

1. chmod +x и "shebang"

По классике, надо добавить первой строкой в скрипте "shebang": #!python или #!/usr/bin/python или #!//usr/bin/env python или даже #p!ipenv run

Главноe - надо помнить, что окружение созданное Runtime.getRuntime() может отличаться от того, что может создаваться в bash/zsh/fish/etc и проверять $PATH, $PYTHONPATH и прочее.

2. Указать интепретатор в cmd напрямую

Изменить команду запуска скрипта, не полагаясь на "shebang" и указать интерпретатор напрямую:

String cmd = "python /home/kiryushin/projects/python/stm/venv/lib/stmtest1.py";

Проверять опять же переменные окружения созданные Runtime.getRuntime.

Интерпретатор:

  • для простых случаев - просто python
  • для случаев сложнее - создать virtualenv и запускать с командой инициализации окружения. Моя рекомендация - использовать pipenv и запускать c pipenv run [имя скрипта]
Answer 2

По незнанию, при создании проекта python забыл, что указал создание виртуальной среды и поэтому после запуска скрипта из Runtime не мог подцепить библиотеку todoist-api. Поэтому я:

  1. Пересоздал проект без создания виртуальной среды (venv)
  2. Указал в ручную интерпретатор и добавил shebang
  3. С помощью pip3 добавил библиотеку todoist-api
  4. В вызове скрипта указал:

    String cmd = "python3.6 /home/kiryushin/projects/python/stm2/stm.py"; Process p = Runtime.getRuntime().exec(cmd);

READ ALSO
Каждый элемент массива нужно умножить с каждым элементом этого массива и проверить, является ли квадратный корень этого произведения, целым числом

Каждый элемент массива нужно умножить с каждым элементом этого массива и проверить, является ли квадратный корень этого произведения, целым числом

Каждый элемент массива нужно умножить с каждым элементом этого массива и проверить, является ли квадратный корень этого произведения, целым...

110
Как присвоить куки jsoup

Как присвоить куки jsoup

Нужно присвоить куки при входе на сайт

111
Как восстановить измененный css-файл на Joomla!

Как восстановить измененный css-файл на Joomla!

Как восстановить нечаянно измененный файл css на Joomla? Бэкапов не делал, кажетсяИмеется ли в системе что-либо наподобие комбинации клавиш "Ctrl+Z"...

113
JS надо скопировать прямоугольную область таблицы

JS надо скопировать прямоугольную область таблицы

Есть (нашел) скрипт, который закрашивает прямоугольную область в html таблицеНужно чтобы эту область можно было копировать, но не получается

132