В этой статье мы рассмотрим, как получить код выхода (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;
Объяснение:
В Python-скрипте: Используем sys.exit(n) для завершения скрипта с кодом возврата n.
В Delphi:
Перехватываем исключение EPySystemExit, которое возникает при вызове sys.exit() в Python.
В обработчике исключения получаем код возврата из E.Message (или E.EValue в новых версиях P4D). Важно отметить, что в старых версиях P4D E.EValue могло быть пустым, поэтому рекомендуется использовать E.Message для совместимости.
Преобразуем полученную строку в целое число с помощью StrToIntDef. Это позволяет избежать ошибок, если E.Message содержит не числовое значение.
Обрабатываем полученный код возврата в конструкции case.
Альтернативные решения:
Использование TPythonGUIInputOutput для перенаправления вывода: Можно перенаправить стандартный вывод Python-скрипта в TPythonGUIInputOutput и анализировать его для получения информации о результате выполнения. Этот метод более сложный, но позволяет получить более подробную информацию, чем просто код возврата.
Возврат результата через глобальную переменную Python: Можно установить глобальную переменную в Python-скрипте и получить ее значение из Delphi после выполнения скрипта. Этот метод требует аккуратной работы с глобальными переменными и может быть менее надежным, чем использование sys.exit().
Использование 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.