Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 15:07   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию Запуск скрипта Python и ожидание его отработки

Всем доброго. Появилось желание прикрутить использование скриптов Питона к некому проекту. Проект должен запустить указанный ему py файл, и подождать пока питон его не отработает полностью.
Пробую так:
Код:
try
 if not CreateProcess(0,'python d:\1\q.py',0,0,false,CREATE_DEFAULT_ERROR_MODE or CREATE_NEW,0,'d:\1',sa,pi)
 then RaiseLastOSError;
except
 on e:exception do  begin write(e.Message);readln;end;
end;
На что получаю AV где-то в kernal32.

После чего пробую так:
Код:
        sei.cbSize := sizeof(SHELLEXECUTEINFO);
        sei.fMask := 0;
        sei.Wnd := 0;
        sei.lpVerb := 0;
        sei.lpFile := 'd:\1\q.py';
        sei.lpParameters := 0;
        sei.lpDirectory := 0;
        sei.nShow := SW_MAXIMIZE;
        sei.hInstApp := 0;

ShellExecuteEx(@sei);
WaitForSingleObject(sei.hProcess,INFINITE);
Все отрабатывает, но WaitForSingleObject не дожидается завершения отработки скрипта, пропуская дальше программу.
WinExec не пробовал, поскольку не представляю как его на ожидание поставить

Вопрос: Почему? Питон чем-то от других приложений отличается?
Если запустить так:
Код:
python d:\1\q.py
из БАТ файла то все хорошо. Почему же WIN API функции так не отрабатывают?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.11.2012, 22:16   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А вы посмотрите что у вас в sei.hProcess, потом проверьте что возвращает WaitForSingleObject и наконец прочитайте внимательно документацию к ShellExecuteEx (точнее SHELLEXECUTEINFO) и читаем внимательно про hProcess
waleri вне форума Ответить с цитированием
Старый 20.11.2012, 22:31   #3
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
sei.cbSize := sizeof(SHELLEXECUTEINFO);
sei.fMask := 0;
sei.Wnd := 0;
sei.lpVerb := 0;
sei.lpFile := 'd:\1\q.py';
sei.lpParameters := 0;
sei.lpDirectory := 0;
sei.nShow := SW_MAXIMIZE;
sei.hInstApp := 0;

ShellExecuteEx(@sei);
ничего не хочу сказать, но (пути разумеется тоже полные должны быть):
Код:
var
  SEInfo: TShellExecuteInfo;
  ExitCode: DWORD;
begin
  FillChar(SEInfo, SizeOf(SEInfo), 0);
  SEInfo.cbSize := SizeOf(TShellExecuteInfo);
  with SEInfo do begin
    fMask := SEE_MASK_NOCLOSEPROCESS;
    Wnd := Application.Handle;
    lpFile := 'python.exe';
    lpParameters := 'd:\1\q.py';
    nShow := SW_HIDE;
  end;
  if ShellExecuteEx(@SEInfo) then
  begin
    repeat
      Application.ProcessMessages;
      GetExitCodeProcess(SEInfo.hProcess, ExitCode);
    until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
    Result:=True;
    //

  end
  else Result:=False;      
end;
OFFTOP >
Цитата:
Появилось желание прикрутить использование скриптов Питона к некому проекту
к этому http://programmersforum.ru/showthread.php?t=218170 ? Были мысли насчет этого http://www.lymar.ru/Использование%20dll%20из%20Python.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 20.11.2012 в 22:36.
raxp вне форума Ответить с цитированием
Старый 20.11.2012, 22:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
проверьте что возвращает WaitForSingleObject
Надо же, на студенческие грабли наступил )
Да проверка нужна обязательно.
Цитата:
читаем внимательно про hProcess
A handle to the newly started application
Ты имеешь ввиду это?:
Цитата:
ShellExecuteEx does not always return an hProcess
Цитата:
к этому
Не, тут другое - заменить некоторые библиотеки на программы с открытым кодом. Я подумал, почему бы не питон?
Цитата:
Были мысли насчет этого
Понял, приму на заметку.
I'm learning to live...

Последний раз редактировалось Stilet; 20.11.2012 в 22:49.
Stilet вне форума Ответить с цитированием
Старый 21.11.2012, 06:51   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Я имел ввиду посмотреть на hProcess и убедившись, что там 0 прочитать вот это:
Цитата:
This member is set on return and is always NULL unless fMask is set to SEE_MASK_NOCLOSEPROCESS. Even if fMask is set to SEE_MASK_NOCLOSEPROCESS, hProcess will be NULL if no process was launched.
waleri вне форума Ответить с цитированием
Старый 21.11.2012, 13:34   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Понял. Учту это.
Кстати на данный момент мне удалось через CreateProcessA решить задачу, непонятно только почему CreateProcessW слажал... (У меня семерка)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.11.2012, 14:41   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Подозреваю, что возможно стринги, которые попали в CreateProcessW не были уникодными. Если А работает а W нет, скорее всего это. Но это так, гадание...
waleri вне форума Ответить с цитированием
Старый 21.11.2012, 14:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хм... Странно получается - DXE вроде юникодит строки...
Ну да ладно - с АНСИ получилось, это уже хорошо.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск скрипта на ruby thashaolinekilla Ruby 1 20.10.2012 01:14
Запуск PHP скрипта Terikon JavaScript, Ajax 5 12.08.2012 16:39
Запуск python скрипта из с++ MrGukk Общие вопросы C/C++ 3 21.03.2012 13:41
Исходники чата на Python требуется запуск. Detka.i.alex PHP 0 27.08.2010 17:17