2011-06-15 22 views
8

estoy felizmente lanzamiento de un programa en un sistema de ventanas de Lua usandoUso os.execute lua en las ventanas para poner en marcha un programa con un destello de CMD

strProgram = '"C:\\Program Files\\Ps Pad\\PSPad.exe"' 
strCmd = 'start "" '..strProgram 
os.execute(strCmd) 

Esto funciona correctamente, poniendo en marcha el programa y el guión refinamiento. Como quiera que parpadee una ventana de comando por una fracción de segundo, alguien tiene una manera de abrir un programa desde Lua.

+0

¿Qué pasa si sólo ejecutar 'strProgram' en lugar de' strCmd'? En otras palabras, ¿realmente necesitas el 'start'? – BMitch

+0

La ventana de comandos permanece abierta todo el tiempo que se ejecuta el programa iniciado y el script de Lua se cuelga hasta que se cierra el programa. –

+1

Desde los documentos, parece que lo están ejecutando a través del shell del sistema operativo (lo siento, estoy en Linux, así que no pude probarlo yo mismo). A menos que alguien conozca un truco de Lua, es posible que deba escribir su propia función en el idioma del host (por ejemplo, C) que hace un 'fork/exec' en lugar de la llamada' system' y exportar esa API a Lua. – BMitch

Respuesta

7

El comando os.execute de Lua se basa en la función de "shell" de la biblioteca estándar de C. En Windows, esta función siempre creará una ventana de comandos, y siempre detendrá su proceso actual hasta que la ventana finalice. Esto último también ocurre en Linux.

En última instancia, no hay forma de evitar esto. No a través de la API estándar de Lua. Debido a que Lua necesita ser liviano e independiente de la plataforma, la API no puede usar API nativas dependientes del sistema operativo.

Su mejor opción sería utilizar el módulo Lua Ex-Api. Es efectivamente un software de abandono, y es posible que necesite corregir algunos problemas del compilador (supongo que el puerto de Windows no era su primera prioridad). Pero es una forma razonablemente buena de generar procesos. Puede optar por esperar hasta que termine usted mismo o dejar que se ejecuten en paralelo. Y no lanzará una ventana de símbolo del sistema, a menos que la aplicación en sí use una.

+0

Gracias por eso, me temo que se ve un poco más allá de mi conjunto de habilidades, se lo transmitiré a la persona cuyo software tenga a Lua y veré si puede agregar una función para mí y lo señalaré con ese código si lo necesita –

+0

Creo que hay al menos una forma de ejecutar un comando sin que aparezca la consola en Windows sin biblioteca adicional, usando io.popen. Por favor mira mi respuesta. –

0

Esta es una forma de ejecutar un comando sin una ventana de consola utilizando solo la API estándar de Lua (es decir, no hay bibliotecas adicionales). Probado en Win7 x64.

function exec_silent(command) 
    local p = assert(io.popen(command)) 
    local result = p:read("*all") 
    p:close() 
    return result 
end 

Editar: vea los comentarios a continuación, podría no funcionar para todos. No estoy seguro por qué.

+0

Negativo, Win7 64 bit y se comporta igual que con solo popen o execute (Lua 5.2.3, linked) – handle

+0

@handle Evidentemente, hay algo diferente en nuestras configuraciones. Estoy usando este código casi todos los días en un sistema de compilación y no aparece ninguna ventana de comandos. –

+0

sin dudarlo, solo preparando a otros para que esto no funcione a pesar de su éxito. – handle

1

Este es el fragmento de código que utilizo para llamar a un lote de Lua, tal vez ayuda. En la consola victoria (símbolo del sistema) abierta y ejecutar, en el mismo Unix (Mac | nix)

-- sBatchFile = .bat for windows, .sh for x 
function vfFork2(sBatchFile) 
    local b = package.cpath:match("%p[\\|/]?%p(%a+)") 
    if b == "dll" then 
     -- windows 
     os.execute('start cmd /k call "'..sBatchFile..'"') 
    elseif b == "dylib" then 
     -- macos 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('open -a Terminal.app "'..sBatchFile..'"') 
    elseif b == "so" then 
     -- Linux 
     os.execute('chmod +x "'..sBatchFile..'"') 
     os.execute('xterm -hold -e "'..sBatchFile..'" & ') 
    end 
end 
Cuestiones relacionadas