Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
medstrах Сообщений: 1810 Дата регистрации: 10.06.2019 |
Ты не обратил внимание на фразу "мне нужен" |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
_vit Сообщений: 5176 Дата регистрации: 29.07.2002 |
В этом коде две алгоритмические ошибки. 1. сначала запускается процесс (команда dir в данном случае) x=o.Exec("cmd /c dir") и тут же посылается команда закрыть его. x.Terminate() Terminate() - посылает оконное сообщение WM_CLOSE главному окну процесса. В результате ваш внешний процесс который вы запустили может не успеть выполнить свою работу И здесь x.StdOut.ReadAll вы можете не получить ничего или только часть данных. 2. Terminate() не закрываеет процесс мгновенно получив сообщение WM_CLOSE приложение может производить еще какие то действия и выводить данные. А x.StdOut.ReadAll уже считывает данные хотя вывод может еще быть не законченным. Прежде чем читать надо убедиться что приложение (процесс) завершен т.е. ждать пока x.Status = 1 В случае когда запускаемое внешнее приложение само завершается выполнив свою функцию как команда dir например правильно будет так:
x.Terminate() следует использовать с осторожностью если внешнее приложение само не завершается как например - notepad.
|
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
_vit Сообщений: 5176 Дата регистрации: 29.07.2002 |
И еще вариант.
Здесь можете ознакомиться в чем разница между вариантами. www.script-coding.com |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
() Надеюсь ТС решит проблу, и расскажет её нам, коллективу )
|
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
kvichans Автор Сообщений: 307 Откуда: Москва Дата регистрации: 19.01.2006 |
Работаю над этим ------------------ Андрей, FoxPro с 2003 года |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
kvichans Автор Сообщений: 307 Откуда: Москва Дата регистрации: 19.01.2006 |
Идея оказалась хорошая.
Вот так работает
Засыпание на 0.1 сек добавлено для разгрузки процессора. Без него тоже работает, но успевает (на крохотном пи-коде) прокрутить десятки тысяч циклов. Из недостатков пока вижу только один. При каждом выполнении Питона выскакивает окно терминала. ------------------ Андрей, FoxPro с 2003 года Исправлено 2 раз(а). Последнее : kvichans, 08.07.19 17:22 |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
medstrах Сообщений: 1810 Дата регистрации: 10.06.2019 |
А нельзя как-то стартовать питон на другом десктопе, чтобы избежать подобного эффекта? Помнится, Рома демонстрировал запуск приложения на других десктопах. |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
В интернетах пишут, что у шелла есть .Run, 3й параметр -
Параметр может принимать целые значения от 0 до 10. Согласно документации, в языке vbscript можно использовать именованные константы, но, они не всегда дают ожидаемый результат, и так как эти значения между собой повторяются, я упомянул лишь три: •0 – скрывает окно, будет виден только процесс в диспетчере задач. •1 – нормальный режим •2 – свернутый вид •3 – развернутый вид scriptcoding.ru |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
kvichans Автор Сообщений: 307 Откуда: Москва Дата регистрации: 19.01.2006 |
Да. Этим я уже давно пользуюсь. Ставлю 7 и окно появляется только в TaskBar-е. Но при таком запуске нет перехвата потоков ------------------ Андрей, FoxPro с 2003 года |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
_vit Сообщений: 5176 Дата регистрации: 29.07.2002 |
Это так. Только второй параметр ;) третий определяет будет ли ожидаться завершение процесса.
но тогда придется повозится что-бы закрыть питоновскую программу по таймауту. Исправлено 1 раз(а). Последнее : _vit, 08.07.19 18:05 |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
_vit Сообщений: 5176 Дата регистрации: 29.07.2002 |
Выводить в файл. Или возьми себя в руки и реализуй задачу с использованием CreateProcess WinAPI. Тогда сможешь вертеть как хочешь.;) |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
BOOL CreateProcessA(
LPCSTR lpApplicationName, LPSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCSTR lpCurrentDirectory, LPSTARTUPINFOA lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); Проще сочинить вспомогательную фоксовую прогу, и запустить её, в фоне, или как, мтк. Чем не параллельный процесс. Многопроцессорность ))) |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
kvichans Автор Сообщений: 307 Откуда: Москва Дата регистрации: 19.01.2006 |
Меня и найденный способ вполне устроил. Всем спасибо. ------------------ Андрей, FoxPro с 2003 года |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
medstrах Сообщений: 1810 Дата регистрации: 10.06.2019 |
Спасибо мало, мог бы и закинуть десяток баксов в виде благодарности |
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
of63 Сообщений: 25256 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Обойдемся. ТС, не прими за чистую монету )
|
Re: Как перехватить stdout/stderr при вызове внешней программы? | |
---|---|
medstrах Сообщений: 1810 Дата регистрации: 10.06.2019 |
Почему ты так не ценишь себя? |
© 2000-2024 Fox Club  |