Как правильно использовать Python показано по ссылке
Выполнение Python скриптов в Кибор в отдельном потоке с синхронизацией и без. Выполнение с файла и отдельными командами с кода Кибор
Данный скрипт покажет как в Кибор можно запускать скрипты Python.
Используется интерпретатор Python, который можно установить самому и указать в скрипте путь к python.exe, либо скачать этот архив 30 МБ. В нем 2 нужных нам файла:
python.exe и python38.dll и папки DLLs и Lib
Поместить эти файлы в папку с программой Кибор.
Запуск интерпретатора происходит в фоновом режиме. Связь с ним осуществляется через канал Pipe.
Демонстрируется выполнение 4 команд с выводом результата каждой.
Так можно выполнять большие скрипты, не выводя промежуточный результат и не выдерживая паузы.
Скрипты можно считывать с файла.
Пример как вводить функцию и ее вызывать:
Код питона с функцией
CODE:
def foo(x, y):
(три пробела)a=5
(три пробела)b=2
(три пробела)c=12
(три пробела)d=255
(три пробела)e=15
(три пробела)print (a+b-x-y)
(три пробела)return a+b+x+y
print (foo(17, 1))
(три пробела)a=5
(три пробела)b=2
(три пробела)c=12
(три пробела)d=255
(три пробела)e=15
(три пробела)print (a+b-x-y)
(три пробела)return a+b+x+y
print (foo(17, 1))
Не забываем про правило отступа в функциях Питона. Поэтому команда Кибор такая:
CODE:
WritePython("def foo(x, y):^n(три пробела)a=5^n(три пробела)b=2^n(три пробела)c=12^n(три пробела)d=255^n(три пробела)e=15^n(три пробела)print (a+b-x-y)^n(три пробела)return a+b+x+y^n^nprint (foo(17, 1))");// Выполнить в питоне "print(5+25)"
CODE:
#define STARTF_USESHOWWINDOW 1
#define STARTF_USESTDHANDLES 256
#define SW_HIDE 0
#define INFINITE -1
external(INT, "CreatePipe", "CreatePipe", "kernel32.dll");
external(VOID, "ZeroMemory", "RtlZeroMemory", "kernel32.dll");
external(VOID, "GetStartupInfo", "GetStartupInfoA", "kernel32.dll");
external(INT, "CreateProcess", "CreateProcessA", "kernel32.dll");
external(INT, "ReadFile", "ReadFile", "kernel32.dll");
external(INT, "WriteFile", "WriteFile", "kernel32.dll");
external(INT, "TerminateProcess", "TerminateProcess", "kernel32.dll");
external(INT, "WaitForSingleObject", "WaitForSingleObject", "kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "kernel32.dll");
string path_python=pathfolder()+"python.exe -i";//Можно писать полный путь к интерпретатору Python если он не в папке с Кибор
int hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
char pi[16];
char W_buff[1000000];
string Rez;
if (StartPython())//Запустить интерпретатор python и наладить с ним связь PIPE
{
ReadPython();
WritePython("print(5+25)");// Выполнить в питоне "print(5+25)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
WritePython("print(2+5)");// Выполнить в питоне "print(2+5)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
WritePython("import webbrowser");// Выполнить в питоне "import webbrowser"
Rez=ReadPython();// Получить ответ
WritePython("webbrowser.open(^'https:/^/google.com^', new=2)");// Выполнить в питоне "webbrowser.open('https://google.com', new=2)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
ClosePython();//Завершить работу с каналом и интерпретатором
}
function StartPython()
{
int ret;
//SECURITY_ATTRIBUTES
char sa[12];
initialarray(#sa[0], 0);
writeaddress(sizearray(sa), address(#sa[0]));
writeaddress(0, address(#sa[4]));
writeaddress(1, address(#sa[8]));
ret=CreatePipe(address(#hReadPipe1),address(#hWritePipe1),address(#sa[0]),0);
if (ret==0)return 0;
ret=CreatePipe(address(#hReadPipe2),address(#hWritePipe2),address(#sa[0]),0);
if (ret==0)return 0;
//STARTUPINFO
char si[68];
initialarray(#si[0], 0);
ZeroMemory(address(#si[0]),sizearray(si));
GetStartupInfo(address(#si[0]));
writeaddress(sizearray(si), address(#si[0]));
writeaddress(STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES, address(#si[44]));
writeaddress(SW_HIDE, address(#si[48]));
writeaddress(hReadPipe2, address(#si[56]));
writeaddress(hWritePipe1, address(#si[60]));
writeaddress(hWritePipe1, address(#si[64]));
//PROCESS_INFORMATION
initialarray(#pi[0], 0);
ret=CreateProcess(0,path_python,0,0,1,0,0,0,address(#si[0]),address(#pi[0]));
if (ret==0)return 0;
return 1;
}
function WritePython(string COMMAND)
{
int lBytesWrite;
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
}
function ReadPython()
{
int readed;
int W_Ta=0;
while(ReadFile(hReadPipe1, address(#W_buff[W_Ta]), 1024 , address(#readed), 0)==1)
{
W_Ta=W_Ta+readed;
if (W_Ta>3)
{
if (W_buff[W_Ta-1]==32 && W_buff[W_Ta-2]==62 && W_buff[W_Ta-3]==62 && W_buff[W_Ta-4]==62)
{
if (W_Ta>4)
{
if (W_buff[W_Ta-5]==10){W_Ta=W_Ta-5; if (W_Ta>0){if (W_buff[W_Ta-1]==13)W_Ta--;} break;}
}
W_Ta=W_Ta-4; if (W_Ta>0){if (W_buff[W_Ta-1]==13)W_Ta--;} break;
}
}
}
W_buff[W_Ta]=0;
int E=0;
i: if (E+3<W_Ta)
{
if (W_buff[E]==46 && W_buff[E+1]==46 && W_buff[E+2]==46 && W_buff[E+3]==32)
{
E=E+4;
goto i;
}
}
if (E+3<W_Ta)
{
if (W_buff[E]==62 && W_buff[E+1]==62 && W_buff[E+2]==62 && W_buff[E+3]==32)
{
E=E+4;
}
}
return format(#W_buff[E]);
}
function ClosePython()
{
TerminateProcess(addressi(address(#pi[0])), 0);
WaitForSingleObject(addressi(address(#pi[0])), INFINITE );
CloseHandle(addressi(address(#pi[0])));
CloseHandle(addressi(address(#pi[4])));
CloseHandle(hReadPipe1);
CloseHandle(hWritePipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe2);
}
#define STARTF_USESTDHANDLES 256
#define SW_HIDE 0
#define INFINITE -1
external(INT, "CreatePipe", "CreatePipe", "kernel32.dll");
external(VOID, "ZeroMemory", "RtlZeroMemory", "kernel32.dll");
external(VOID, "GetStartupInfo", "GetStartupInfoA", "kernel32.dll");
external(INT, "CreateProcess", "CreateProcessA", "kernel32.dll");
external(INT, "ReadFile", "ReadFile", "kernel32.dll");
external(INT, "WriteFile", "WriteFile", "kernel32.dll");
external(INT, "TerminateProcess", "TerminateProcess", "kernel32.dll");
external(INT, "WaitForSingleObject", "WaitForSingleObject", "kernel32.dll");
external(INT, "CloseHandle", "CloseHandle", "kernel32.dll");
string path_python=pathfolder()+"python.exe -i";//Можно писать полный путь к интерпретатору Python если он не в папке с Кибор
int hReadPipe1, hWritePipe1, hReadPipe2, hWritePipe2;
char pi[16];
char W_buff[1000000];
string Rez;
if (StartPython())//Запустить интерпретатор python и наладить с ним связь PIPE
{
ReadPython();
WritePython("print(5+25)");// Выполнить в питоне "print(5+25)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
WritePython("print(2+5)");// Выполнить в питоне "print(2+5)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
WritePython("import webbrowser");// Выполнить в питоне "import webbrowser"
Rez=ReadPython();// Получить ответ
WritePython("webbrowser.open(^'https:/^/google.com^', new=2)");// Выполнить в питоне "webbrowser.open('https://google.com', new=2)"
Rez=ReadPython();// Получить ответ
messagebox (Rez);// Показать ответ
ClosePython();//Завершить работу с каналом и интерпретатором
}
function StartPython()
{
int ret;
//SECURITY_ATTRIBUTES
char sa[12];
initialarray(#sa[0], 0);
writeaddress(sizearray(sa), address(#sa[0]));
writeaddress(0, address(#sa[4]));
writeaddress(1, address(#sa[8]));
ret=CreatePipe(address(#hReadPipe1),address(#hWritePipe1),address(#sa[0]),0);
if (ret==0)return 0;
ret=CreatePipe(address(#hReadPipe2),address(#hWritePipe2),address(#sa[0]),0);
if (ret==0)return 0;
//STARTUPINFO
char si[68];
initialarray(#si[0], 0);
ZeroMemory(address(#si[0]),sizearray(si));
GetStartupInfo(address(#si[0]));
writeaddress(sizearray(si), address(#si[0]));
writeaddress(STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES, address(#si[44]));
writeaddress(SW_HIDE, address(#si[48]));
writeaddress(hReadPipe2, address(#si[56]));
writeaddress(hWritePipe1, address(#si[60]));
writeaddress(hWritePipe1, address(#si[64]));
//PROCESS_INFORMATION
initialarray(#pi[0], 0);
ret=CreateProcess(0,path_python,0,0,1,0,0,0,address(#si[0]),address(#pi[0]));
if (ret==0)return 0;
return 1;
}
function WritePython(string COMMAND)
{
int lBytesWrite;
WriteFile(hWritePipe2,COMMAND+"^n", size(COMMAND+"^n"), address(#lBytesWrite), 0);
}
function ReadPython()
{
int readed;
int W_Ta=0;
while(ReadFile(hReadPipe1, address(#W_buff[W_Ta]), 1024 , address(#readed), 0)==1)
{
W_Ta=W_Ta+readed;
if (W_Ta>3)
{
if (W_buff[W_Ta-1]==32 && W_buff[W_Ta-2]==62 && W_buff[W_Ta-3]==62 && W_buff[W_Ta-4]==62)
{
if (W_Ta>4)
{
if (W_buff[W_Ta-5]==10){W_Ta=W_Ta-5; if (W_Ta>0){if (W_buff[W_Ta-1]==13)W_Ta--;} break;}
}
W_Ta=W_Ta-4; if (W_Ta>0){if (W_buff[W_Ta-1]==13)W_Ta--;} break;
}
}
}
W_buff[W_Ta]=0;
int E=0;
i: if (E+3<W_Ta)
{
if (W_buff[E]==46 && W_buff[E+1]==46 && W_buff[E+2]==46 && W_buff[E+3]==32)
{
E=E+4;
goto i;
}
}
if (E+3<W_Ta)
{
if (W_buff[E]==62 && W_buff[E+1]==62 && W_buff[E+2]==62 && W_buff[E+3]==32)
{
E=E+4;
}
}
return format(#W_buff[E]);
}
function ClosePython()
{
TerminateProcess(addressi(address(#pi[0])), 0);
WaitForSingleObject(addressi(address(#pi[0])), INFINITE );
CloseHandle(addressi(address(#pi[0])));
CloseHandle(addressi(address(#pi[4])));
CloseHandle(hReadPipe1);
CloseHandle(hWritePipe1);
CloseHandle(hReadPipe2);
CloseHandle(hWritePipe2);
}