В современном программировании часто возникает необходимость использовать несколько языков программирования в одном проекте. Одним из популярных способов является использование Python в сочетании с Delphi. В этой статье мы рассмотрим, как вывести данные в консоль из Delphi, используя Python для выполнения вычислений.
Проблема
При работе с Python в Delphi через компоненты TPythonEngine и TPythonInputOutput может возникнуть проблема с выводом данных в консоль. Несмотря на то, что события OnReceiveUniData или OnSendUniData не работают, данные успешно выводятся через TPythonGUIInputOutput.Output.
Контекст
В контексте данной статьи мы будем использовать компоненты TPythonEngine и TPythonInputOutput для вывода данных в консоль из Delphi с помощью Python. Мы рассмотрим пример, в котором будем выводить простую строку "Hello" с помощью функции print() в Python.
Решение
Используя совет от пользователя pyscripter, мы можем решить проблему, изменив обработчик события OnSendUniData и используя TPythonInputOutput вместо TPythonGUIInputOutput. Вот пример кода, который демонстрирует это решение:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, PythonEngine, PythonInputOutput;
type
TForm2 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure OnData(Sender: TObject; const Data: string);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
PythonEngine: TPythonEngine;
working: boolean = True;
implementation
{$R *.dfm}
procedure TForm2.OnData(Sender: TObject; const Data: string);
begin
TThread.Synchronize(nil,
procedure
begin
Memo1.Lines.Add(Data);
end);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
pyio: TPythonInputOutput;
begin
pyio := TPythonInputOutput.Create(nil);
pyio.UnicodeIO := True;
pyio.DelayWrites := False;
pyio.OnSendUniData := OnData;
PythonEngine := TPythonEngine.Create(nil);
PythonEngine.IO := pyio;
PythonEngine.RedirectIO := True;
PythonEngine.LoadDll;
TPythonThread.Py_Begin_Allow_Threads;
TThread.CreateAnonymousThread(
procedure
var
Py: IPyEngineAndGIL;
begin
Py := SafePyEngine;
while working do
PythonEngine.ExecString('print("Hello")');
end).Start;
end;
end.
В этом примере мы создаем экземпляр TPythonInputOutput и настраиваем его для работы с Unicode и отключаем отложенный вывод. Мы также устанавливаем обработчик события OnSendUniData, который добавляет полученные данные в TMemo. При нажатии на кнопку Button1 мы создаем новый поток, в котором выполняем команду print("Hello") в Python. Результат вывода данных добавляется в TMemo с помощью обработчика события OnData.
Альтернативное решение
Если вам нужно вывести данные в консоль, а не в TMemo, вы можете использовать компонент TPythonConsoleOutput вместо TPythonInputOutput. Вот пример кода, который демонстрирует это альтернативное решение:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, PythonEngine, PythonConsoleOutput;
type
TForm2 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
PythonEngine: TPythonEngine;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
var
pyco: TPythonConsoleOutput;
begin
pyco := TPythonConsoleOutput.Create(nil);
PythonEngine := TPythonEngine.Create(nil);
PythonEngine.IO := pyco;
PythonEngine.RedirectIO := True;
PythonEngine.LoadDll;
TPythonThread.Py_Begin_Allow_Threads;
TThread.CreateAnonymousThread(
procedure
var
Py: IPyEngineAndGIL;
begin
Py := SafePyEngine;
PythonEngine.ExecString('print("Hello")');
end).Start;
end;
end.
В этом примере мы создаем экземпляр TPythonConsoleOutput и настраиваем его для работы с PythonEngine. При нажатии на кнопку Button1 мы создаем новый поток, в котором выполняем команду print("Hello") в Python. Результат вывода данных будет отображаться в консоли, открытой автоматически.
Заключение
В данной статье мы рассмотрели проблему вывода данных в консоль из Delphi с помощью Python и предложили два решения: использование TPythonInputOutput и TPythonConsoleOutput. Оба решения позволят вам выводить данные в консоль или в TMemo в зависимости от ваших потребностей.
Вывод данных в консоль из Delphi с помощью Python.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.