Эксперт
Покинул форум
Сообщений всего: 8218
Дата рег-ции: Март 2013
Откуда: Одесса
Репутация: 357
|
Adomb пишет: с функцией затык получается?
Пример как вводить функцию и ее вызывать:
Код питона с функцией
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))
Не забываем про правило отступа в функциях Питона. Поэтому команда Кибор такая:
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: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))
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();
//Вводим функцию и вызываеми ее (не забываем про правило отступов)
/*
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))
*/
//Так делать не надо. Достаточно в строке указать три пробела. Просто на форуме они превращаются в один..
string prb=" "+" "+" ";
WritePython("def foo(x, y):^n"+prb+"a=5^n"+prb+"b=2^n"+prb+"c=12^n"+prb+"d=255^n"+prb+"e=15^n"+prb+"print (a+b-x-y)^n"+prb+"return a+b+x+y^n^nprint (foo(17, 1))");// Выполнить в питоне "print(5+25)"
//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)"
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);
}
Если надо с файла, прочитайте его в бинарном режиме. С помощью регулярки замените все \r\n на \n, переведите в стринг и запускайте.
Не забудьте что пустые строки будут Ентер. Так же про пробелы тоже. |