2010-05-26 19 views
6

Estoy convirtiendo un archivo XLS 2 CSV con un comando del sistema en Ruby.Cómo esperar a que finalice el comando del sistema

Después de la conversión estoy procesando los archivos CSV, pero la conversión aún se está ejecutando cuando el programa desea procesar los archivos, por lo que en ese momento no existen.

¿Puede alguien decirme si es posible dejar que Ruby espere la cantidad de tiempo correcta para que termine el comando del sistema?

En este momento estoy usando:

sleep 20 

pero si se tardará más de una vez, que no está bien, por supuesto.

Lo que hago en concreto es la siguiente:

#Call on the program to convert xls 
command = "C:/Development/Tools/xls2csv/xls2csv.exe C:/TDLINK/file1.xls" 
system(command) 
do_stuff 

def do_stuff 
#This is where i use file1.csv, however, it isn't here yet 
end 
+1

Por favor, muéstrenos un ejemplo de su código actual o explique la función. Hasta donde yo sé, las llamadas al sistema no solo se "descargan", así que estoy pensando que lo estás descargando de alguna manera. –

+1

¿El comando del sistema devuelve éxito? Asigne el valor de retorno del sistema a una variable y luego verifique su contenido. El comando del sistema debe ejecutarse sincrónicamente. –

+0

Cuando asigno el sistema (comando) a una variable, devuelve inmediatamente verdadero. Entonces eso tampoco es una opción – Ignace

Respuesta

1

intenta utilizar hilos:

command = Thread.new do 
    system('ruby programm.rb') # long-long programm 
end 
command.join     # main programm waiting for thread 
puts "command complete" 
+12

¿En qué se diferencia el uso de un subproceso secundario del comando del sistema en el subproceso principal? Si el comando del sistema se ejecuta de forma asíncrona en el hilo principal, también lo hará en el hilo secundario. Entonces la unión terminaría inmediatamente mientras el comando del sistema aún se está ejecutando. – Aurril

13

método de Ruby system("...") es sincrónico; es decir, espera que el comando al que llama devuelva un código de salida y system devuelve verdadero si el comando salió con un estado 0 y falso si salió con un estado que no es 0. acentos abiertos de Ruby devolver la salida de la commmand:

a = `ls` 

establecerá a a una cadena con una lista del directorio de trabajo actual.

Parece que xls2csv.exe devuelve un código de salida antes de que finalice lo que se supone que debe hacer. Tal vez este es un problema de Windows. Por lo tanto, parece que tendrá que realizar un ciclo hasta que el archivo exista:

until File.exist?("file1.csv") 
    sleep 1 
end 
+0

resolviendo por y ..... – baash05

Cuestiones relacionadas