2010-05-26 9 views
6

Je convertis un fichier CSV XLS 2 avec une commande système dans Ruby.Comment attendre la fin de la commande système

Après la conversion, je suis en train de traiter les fichiers CSV, mais la conversion est toujours en cours lorsque le programme veut traiter les fichiers, alors ils sont inexistants à ce moment-là. Est-ce que quelqu'un peut me dire s'il est possible de laisser Ruby attendre le bon moment pour que la commande système se termine?

En ce moment je suis en utilisant:

sleep 20 

mais si elle prendra plus de temps une fois, il ne convient pas bien sûr.

Ce que je fais est précisément ceci:

#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

Veuillez nous montrer un exemple de votre code actuel ou expliquer la fonction. Autant que je sache, les appels système ne sont pas seulement "déchargés", donc je pense que vous le déchargez d'une manière ou d'une autre. –

+1

La commande système renvoie-t-elle le succès? Affectez la valeur de retour du système à une variable, puis vérifiez son contenu. La commande système doit s'exécuter de manière synchrone. –

+0

Lorsque j'attribue le système (commande) à une variable, il retourne immédiatement vrai. Donc, ce n'est pas une option non plus – Ignace

Répondre

1

Essayez d'utiliser des fils:

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

En quoi l'utilisation d'un thread secondaire est-elle différente de l'utilisation de la commande système dans le thread principal? Si la commande système s'exécute de manière asynchrone dans le thread principal, elle le sera également dans le thread secondaire. La jointure se termine donc immédiatement lorsque la commande système est toujours en cours d'exécution. – Aurril

13

méthode de Ruby system("...") est synchrone; c'est-à-dire qu'il attend la commande qu'il appelle pour retourner un code de sortie et system renvoie vrai si la commande est sortie avec un statut 0 et faux si elle est sortie avec un statut non-0. Les accents graves de Ruby retournent la sortie du commmand:

a = `ls` 

sera mis a à une chaîne avec une liste du répertoire de travail courant.

Il semble donc que xls2csv.exe renvoie un code de sortie avant qu'il ne termine ce qu'il est censé faire. Peut-être que c'est un problème de Windows. Il semble donc que vous devrez boucler jusqu'à ce que le fichier existe:

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

résoudre pour y ..... – baash05

Questions connexes