Привет, Celebr0! Я вижу, что у вас возникли трудности с запуском нескольких экземпляров скрипта Python в вашем приложении на Delphi. Давайте рассмотрим эту проблему и найдем решение.
Проблема заключается в том, что вы пытаетесь запустить несколько скриптов в одном интерпретаторе Python, что приводит к сбою вашего приложения. Кроме того, если вы создаете и уничтожаете экземпляр TPythonEngine, вы получаете ошибку, указывающую на то, что Python.dll уже используется.
Решением этой проблемы может быть использование нескольких экземпляров интерпретатора Python и запуск каждого скрипта в отдельном потоке. Для этого мы можем использовать класс TPythonThread и создать несколько экземпляров этого класса, каждый из которых будет запускать свой скрипт Python.
Вот пример кода, который демонстрирует, как это можно сделать:
program ParallelPython;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Diagnostics,
System.Variants,
System.SyncObjs,
PythonEngine;
type
TPyThread = class(TPythonThread)
protected
procedure ExecuteWithPython; override;
public
constructor Create(createsuspended:boolean; scriptName: string);
end;
procedure CreatePyEngine;
begin
TPythonThread.Py_Begin_Allow_Threads;
end;
procedure DestroyEngine;
begin
TPythonThread.Py_End_Allow_Threads;
end;
procedure TPyThread.ExecuteWithPython;
begin
inherited;
while true do begin
try
PythonEngine.ExecFile(ScriptName);
except
on E: Exception do
Writeln('Error executing script: ', E.Message);
end;
end;
end;
constructor TPyThread.Create(createsuspended:boolean; scriptName: string);
begin
inherited Create(CreateSuspended);
ThreadExecMode := emNewInterpreterOwnGIL;
FreeOnTerminate := True;
ScriptName := scriptName;
end;
var
I: Integer;
Threads: TArray<TPyThread>;
begin
try
CreatePyEngine;
SetLength(Threads, 10);
for I := 0 to 9 do
Threads[I] := TPyThread.Create(False, 'script' + IntToStr(I + 1) + '.py');
for I := 0 to 9 do
Threads[I].Start;
for I := 0 to 9 do
Threads[I].WaitFor;
finally
DestroyEngine;
end;
ReadLn;
end.
В этом примере мы создаем массив из 10 экземпляров TPyThread, каждый из которых запускает свой скрипт Python (в данном случае, скрипты называются script1.py, script2.py, и так далее). Каждый поток запускается в отдельном интерпретаторе Python, что предотвращает конфликты между скриптами.
Также, мы обрабатываем возможные исключения, которые могут возникнуть при выполнении скриптов, чтобы предотвратить сбой всего приложения.
Надеюсь, это поможет вам решить вашу проблему! Если у вас есть дальнейшие вопросы, не стесняйтесь спрашивать.
Пользователь испытывает трудности с запуском нескольких скриптов Python в приложении на Delphi и ищет решение, используя несколько экземпляров интерпретатора Python и запуск каждого скрипта в отдельном потоке.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS