Как ждать окончания системной команды - PullRequest
7 голосов
/ 26 мая 2010

Я конвертирую XLS 2 CSV-файл с помощью системной команды в Ruby.

После преобразования я обрабатываю файлы CSV, но преобразование все еще выполняется, когда программа хочет обработать файлы, поэтому на данный момент они отсутствуют.

Может кто-нибудь сказать мне, можно ли позволить Ruby ждать подходящее время для завершения системной команды?

Прямо сейчас я использую:

sleep 20

но если это займет больше времени, конечно, это неправильно.

Что конкретно я делаю, так это:

#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

Ответы [ 2 ]

16 голосов
/ 27 декабря 2010

метод Руби system("...") является синхронным; то есть он ожидает, что команда, которую он вызывает, возвращает код завершения, а system возвращает значение true, если команда завершилась со статусом 0, и false, если она вышла со статусом не-0. Обратные метки Ruby возвращают вывод команды:

a = `ls`

установит a в строку со списком текущего рабочего каталога.

Похоже, что xls2csv.exe возвращает код завершения, прежде чем завершить то, что должен делать. Может быть, это проблема Windows. Похоже, вам придется зацикливаться, пока файл не будет существовать:

until File.exist?("file1.csv")
  sleep 1
end
1 голос
/ 26 мая 2010

Попробуйте использовать темы:

command = Thread.new do
  system('ruby programm.rb') # long-long programm
end
command.join                 # main programm waiting for thread
puts "command complete"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...