Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как получить код выхода (errorlevel) Python-скрипта в Delphi с использованием Pascal

Delphi , Синтаксис , Синтаксис

 

В этой статье мы рассмотрим, как получить код выхода (errorlevel) Python-скрипта, выполняемого из Delphi, используя библиотеку Python for Delphi (P4D). Эта задача часто возникает, когда необходимо интегрировать Python-скрипты в Delphi-приложения и реагировать на результаты их выполнения.

Проблема:

Необходимо получить целочисленный код возврата Python-скрипта, чтобы определить дальнейшие действия в Delphi-приложении. Простой вызов PythonEngine1.ExecStrings(lines) не предоставляет прямого доступа к коду возврата. Вместо этого, ошибки в Python-скрипте приводят к исключениям в Delphi.

Решение (предложенное в контексте):

Использовать sys.exit(n) в Python-скрипте для возврата кода выхода и перехватывать исключение EPySystemExit в Delphi.

Пример кода Python:

import sys

# ... ваш код ...

# Возвращаем код 101, если что-то пошло не так
sys.exit(101)

Пример кода Delphi:

uses
  PythonEngine;

function ExecPython(lines: TStrings): integer;
begin
  Result := 0; // По умолчанию считаем, что все хорошо
  try
    PythonEngine1.ExecStrings(lines);
  except
    on E: EPySystemExit do
    begin
      // E.EValue должно содержать код выхода, но в старых версиях P4D
      // могло быть пустым.  Вместо этого можно использовать E.Message.

      // Получаем код выхода из E.Message (для совместимости со старыми версиями P4D)
      Result := StrToIntDef(E.Message, -1); // -1 - значение по умолчанию, если не удалось преобразовать

      // В новых версиях P4D можно использовать E.EValue
      // Result := StrToIntDef(E.EValue, -1);
    end;
    on E: Exception do
    begin
      // Обработка других исключений
      Result := GetLastError(); // Или другой код ошибки
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  python_script: TStringList;
  script_result: integer;
begin
  python_script := TStringList.Create;
  try
    python_script.Add('import sys');
    python_script.Add('print("Hello from Python!")');
    python_script.Add('sys.exit(101)'); // Пример возврата кода 101

    script_result := ExecPython(python_script);

    case script_result of
      0: Showmessage('All good');
      101: Showmessage('Retry using some other setup');
      102: Showmessage('Connection failed, please re-connect');
      -1: Showmessage('Error parsing exit code'); // Обработка ошибок парсинга
      else
        Showmessage('Unknown result code: ' + IntToStr(script_result));
    end;
  finally
    python_script.Free;
  end;
end;

Объяснение:

  1. В Python-скрипте: Используем sys.exit(n) для завершения скрипта с кодом возврата n.
  2. В Delphi:
    • Перехватываем исключение EPySystemExit, которое возникает при вызове sys.exit() в Python.
    • В обработчике исключения получаем код возврата из E.Message (или E.EValue в новых версиях P4D). Важно отметить, что в старых версиях P4D E.EValue могло быть пустым, поэтому рекомендуется использовать E.Message для совместимости.
    • Преобразуем полученную строку в целое число с помощью StrToIntDef. Это позволяет избежать ошибок, если E.Message содержит не числовое значение.
    • Обрабатываем полученный код возврата в конструкции case.

Альтернативные решения:

  1. Использование TPythonGUIInputOutput для перенаправления вывода: Можно перенаправить стандартный вывод Python-скрипта в TPythonGUIInputOutput и анализировать его для получения информации о результате выполнения. Этот метод более сложный, но позволяет получить более подробную информацию, чем просто код возврата.
  2. Возврат результата через глобальную переменную Python: Можно установить глобальную переменную в Python-скрипте и получить ее значение из Delphi после выполнения скрипта. Этот метод требует аккуратной работы с глобальными переменными и может быть менее надежным, чем использование sys.exit().
  3. Использование JSON для передачи данных: Python-скрипт может возвращать результат в формате JSON, который легко парсится в Delphi. Этот метод позволяет передавать более сложные структуры данных, чем просто код возврата.

Важные замечания:

  • Обновление P4D: Убедитесь, что вы используете последнюю версию Python for Delphi, чтобы избежать проблем с E.EValue.
  • Обработка исключений: Всегда обрабатывайте исключения, которые могут возникнуть при выполнении Python-скрипта, чтобы ваше Delphi-приложение работало стабильно.
  • Безопасность: Будьте осторожны при выполнении Python-скриптов, полученных из ненадежных источников, так как они могут содержать вредоносный код.

В заключение, получение кода выхода Python-скрипта в Delphi с использованием sys.exit() и перехвата EPySystemExit является простым и эффективным способом интеграции Python-скриптов в Delphi-приложения. Не забудьте обновить P4D и тщательно обрабатывать исключения для обеспечения стабильной работы вашего приложения.

Создано по материалам из источника по ссылке.

Контекст описывает способ получения кода выхода Python-скрипта в Delphi с использованием библиотеки Python for Delphi (P4D) путем перехвата исключения `EPySystemExit`, генерируемого функцией `sys.exit(n)` в Python.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Синтаксис ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-09-23 22:26:07/0.006152868270874/0