Новичок
Профиль
Группа: Участник
Сообщений: 49
Регистрация: 9.11.2005
Репутация: нет Всего: нет
|
Добрый день. Не знаю или в тот раздел запостил вопрос, но он скорее связан с Питоном, чем с созданием канала Pipе. Суть такая. Питон запускается с С++ с помощью CreateProcess и создается канал Pipe. Работа с интерпретатором через PeekNamedPipe WriteFile ReadFile происходит нормально. Без проблем. Но единственная проблема возникает когда в питоме создается диалоговое окно с помощью tkinter функцией Tk() Окно создается и мы считываем ответ в виде >>> Но затем взаимодействовать с интерпретатором невозможно. Отправив любую команду (она отправится) питон ничего не отвечает. Функция PeekNamedPipe возвращает 0 байт готовых для чтения. Код С++, демонстрирующий этот процесс Код специально разжеван, поставлены тех паузы и всевозможные проверки что бы была видна его работа. Может кто знает почему при работе через канал после создания диалогового онкна в питоне работать через канал с интерпретатором невозможно в данном случае? Нигде даже близко ответ не нашел.. Цитата | unsigned long PlBytesWrite; HANDLE PhReadPipe1,PhWritePipe1,PhReadPipe2,PhWritePipe2; SECURITY_ATTRIBUTES Psa; STARTUPINFO Psi; PROCESS_INFORMATION Ppi; CString COMMAND; DWORD PbytesAvail; int PbResult; unsigned long Preaded; CString COMMAND_Pipe; char BYTE_PIPE[1000000]; int Ta;
//SECURITY_ATTRIBUTES; Psa.nLength = sizeof(Psa); Psa.lpSecurityDescriptor = 0; Psa.bInheritHandle = TRUE;
if (!CreatePipe(&PhReadPipe1,&PhWritePipe1,&Psa,0)) { MessageBox ("error CreatePipe"); return; } if (!CreatePipe(&PhReadPipe2,&PhWritePipe2,&Psa,0)) { CloseHandle(PhReadPipe1); CloseHandle(PhWritePipe1); MessageBox ("error CreatePipe"); return; } //STARTUPINFO Pythonsi; ZeroMemory(&Psi, sizeof(Psi)); GetStartupInfo(&Psi);
Psi.cb = sizeof(Psi); Psi.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; Psi.wShowWindow = SW_HIDE; Psi.hStdInput = PhReadPipe2; Psi.hStdOutput = Psi.hStdError = PhWritePipe1;
//PROCESS_INFORMATION Pythonpi; ZeroMemory(&Ppi,sizeof(Ppi));
CString Path="D:\\python\\python.exe -i"; char PythonPath[1000]; PythonPath[0]=0; strcat(PythonPath,Path); PythonPath[strlen(Path)]=0;
if (!CreateProcess(NULL, PythonPath, NULL, NULL, TRUE, 0, NULL, NULL, &Psi, &Ppi)) { CloseHandle(PhReadPipe1); CloseHandle(PhWritePipe1); CloseHandle(PhReadPipe2); CloseHandle(PhWritePipe2); MessageBox ("error CreateProcess"); return; }
MessageBox ("Процесс запущен. Канал создан");
//Ждем когда в канале появятся данные для считывания PbytesAvail=0; while(PbytesAvail==0) { if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } Sleep(1); }
//Отправляем python команду from tkinter import * и ентер и получаем ответ РАБОТАЕТ ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ COMMAND_Pipe="from tkinter import *\n"; if (!WriteFile(PhWritePipe2, COMMAND_Pipe, strlen(COMMAND_Pipe), &PlBytesWrite, NULL)) { MessageBox ("error WriteFile"); return; } MessageBox ("Отправили "+COMMAND_Pipe);
Sleep(500);//Выдерживаем паузу что бы наверняка питом выдал ответ
//Ждем когда в канале появятся данные для считывания PbytesAvail=0; while(PbytesAvail==0) { if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } Sleep(1); }
///////////////////////////////////////// Ta=0; while(1) { PbResult=ReadFile(PhReadPipe1, &BYTE_PIPE[Ta], PbytesAvail , &Preaded, 0);//Читаем if (!PbResult) break; if (!Preaded) break;//Если ничего не считано Ta=Ta+Preaded; BYTE_PIPE[Ta]=0;
Sleep(10);//Делаем паузу что бьы наверняка питон был ьготов дать еще данные
PbytesAvail=0; if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } if (!PbytesAvail) break;//Если данных больше нет } //////////////////////////////////////
MessageBox (BYTE_PIPE);//Получаем ответ ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//Отправляем python команду window = Tk() и ентер и получаем ответ РАБОТАЕТ . Создается окно и считывается ответ интерпретатора Python ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ COMMAND_Pipe="window = Tk()\n"; if (!WriteFile(PhWritePipe2, COMMAND_Pipe, strlen(COMMAND_Pipe), &PlBytesWrite, NULL)) { MessageBox ("error WriteFile"); return; } MessageBox ("Отправили "+COMMAND_Pipe);
Sleep(500);//Выдерживаем паузу что бы наверняка питом выдал ответ
//Ждем когда в канале появятся данные для считывания PbytesAvail=0; while(PbytesAvail==0) { if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } Sleep(1); }
///////////////////////////////////////// Ta=0; while(1) { PbResult=ReadFile(PhReadPipe1, &BYTE_PIPE[Ta], PbytesAvail , &Preaded, 0);//Читаем if (!PbResult) break; if (!Preaded) break;//Если ничего не считано Ta=Ta+Preaded; BYTE_PIPE[Ta]=0;
Sleep(10);//Делаем паузу что бьы наверняка питон был ьготов дать еще данные
PbytesAvail=0; if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } if (!PbytesAvail) break;//Если данных больше нет } //////////////////////////////////////
MessageBox (BYTE_PIPE);//Получаем ответ ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
//Отправляем python любую команду. В данном случае print(5) и ентер и получаем ответ //Команда отправляется, Но Python большен ничего не отвечает. ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ COMMAND_Pipe="print(5)\n"; if (!WriteFile(PhWritePipe2, COMMAND_Pipe, strlen(COMMAND_Pipe), &PlBytesWrite, NULL)) { MessageBox ("error WriteFile"); return; } MessageBox ("Отправили "+COMMAND_Pipe);
Sleep(500);//Выдерживаем паузу что бы наверняка питом выдал ответ
//Ждем когда в канале появятся данные для считывания ОТВЕТА НЕ ДОЖДЕМСЯ. ЗАВИСНЕМ PbytesAvail=0; while(PbytesAvail==0) { if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } Sleep(1); }
///////////////////////////////////////// Ta=0; while(1) { PbResult=ReadFile(PhReadPipe1, &BYTE_PIPE[Ta], PbytesAvail , &Preaded, 0);//Читаем if (!PbResult) break; if (!Preaded) break;//Если ничего не считано Ta=Ta+Preaded; BYTE_PIPE[Ta]=0;
Sleep(10);//Делаем паузу что бьы наверняка питон был ьготов дать еще данные
PbytesAvail=0; if (PeekNamedPipe(PhReadPipe1, NULL, 0, NULL, &PbytesAvail, NULL)==0) { MessageBox ("error 1"); return; } if (!PbytesAvail) break;//Если данных больше нет } //////////////////////////////////////
MessageBox (BYTE_PIPE);//Получаем ответ ///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
|
|