Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с интерпретатора Python через Pipe, Зависает при создание GUI функцией Tk() 
:(
    Опции темы
DMaster
Дата 28.1.2021, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 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);//Получаем ответ
///@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1093 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.