Page 1 of 3

модуль для запуска консольных программ и получения их вывода

Posted: Mon 09 Jun, 2014 16:24
by zg
сам модуль:
execute_v2.7z
(2.32 KiB) Downloaded 553 times
пример, как можно скомпилировать программу на c++ при помощи gcc и если есть ошибки — перейти к месту их обнаружения:

 ! Message from: John Doe
Альтернативная версия модуля, с дополнительными функциями, см. тут: viewtopic.php?p=167895#p167895

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 16:59
by Shmuel
Как всегда - красиво.

Придирки по мелочам:
1. В модуле можно просто сделать return Execute, не нужно создавать 2 таблицы.
2. В макросе можно задать filemask="*.cpp".

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 17:23
by zg
Shmuel wrote:1. В модуле можно просто сделать return Execute, не нужно создавать 2 таблицы.
что-то я затупил на тему того, что модуль должен возвращать таблицу :?

всё поправил.

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 18:49
by AleXH
В длинных строках паттерны с дублированными обратными слешами не будут матчиться.

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 18:52
by zg
AleXH wrote:В длинных строках паттерны с дублированными обратными слешами не будут матчиться.
например?

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 18:58
by AleXH
проверил - был не прав

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 19:06
by zg
AleXH wrote:имхо из-за длинных строк слеши должны быть одинарными.
должны, но работать будет и так.

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 20:32
by fml2
По-моему, имя переменной "readed" неправильно с точки зрения английской грамматики. Правильно было бы "read". Или это такой программистский сленг? Я знаю, что в программах инога специлаьно пишут "setted", желая подчеркнуть, что это именно прошедшее время от "set". Но с "read" я такого еще не встречал.

Re: модуль для запуска консольных программ и получения их вы

Posted: Mon 09 Jun, 2014 20:38
by Shmuel
Патч, сокращает модуль на 15 строк.
patch.1.7z
(636 Bytes) Downloaded 293 times

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 07:49
by John Doe
Можно сократить ещё, т.к. структура SECURITY_ATTRIBUTES уже определена в winapi.lua

И насколько я понимаю, структуры можно полностью (либо частично) инициализировать прямо в конструкторе:

Code: Select all

  local pipe_security=ffi.new("SECURITY_ATTRIBUTES")
  pipe_security.nLength=ffi.sizeof(pipe_security)
  pipe_security.bInheritHandle=true
Это же можно записать так: local pipe_security=ffi.new("SECURITY_ATTRIBUTES",ffi.sizeof("SECURITY_ATTRIBUTES"),nil,true)

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 08:52
by John Doe
Модуль покритикую.
Код конечно хорошо, но в шапке можно было бы и разжевать интерфейс функции Execute.
Саму функцию (раз уж это модуль) стоило бы сделать более универсальной, сейчас например никак не обрабатываются ошибки запуска.

P.S.
А вообще стоило бы добавить в LuaFAR юникодный аналог io.popen.

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 09:18
by Shmuel
John Doe wrote:А вообще стоило бы добавить в LuaFAR юникодный аналог io.popen.
Можно взглянуть на пример "неюникодности" io.popen в LuaFAR?

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 09:21
by tstr
При запуске через Execute "доходит" ли до процесса CtrlC/CtrlBreak ?

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 10:12
by zg
tstr wrote:При запуске через Execute "доходит" ли до процесса CtrlC/CtrlBreak ?
да.

Re: модуль для запуска консольных программ и получения их вы

Posted: Tue 10 Jun, 2014 10:13
by John Doe
Shmuel wrote:Можно взглянуть на пример "неюникодности" io.popen в LuaFAR?
Был не прав, перепутал с функциями os.*
В таком случае в чём преимущество обсуждаемой тут реализации Execute перед стандартной io.popen?