Как запустить подпроцессы параллельно, дождаться их завершения и запустить подпроцесс - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь запустить GDAL (обработку изображений) параллельно, а затем сохранить путь к выходным файлам в списке, который должен быть записан в файл. этот файл необходимо использовать в единственной команде подпроцесса.

У меня нет большого опыта работы с мультипроцессорами / подпроцессами, но я прочитал Параллельный запуск нескольких подпроцессов - python 2.7

Как запустить несколько подпроцессов параллельно и дождаться их завершения в Python

Второй вопрос - на чем я основывал большую часть моего текущего кода. Тем не менее, он возвращает некоторые ошибки:

этот фрагмент работает параллельно:

    childprocesses = []

    for fil in files: #files is list of input .tif files
        p = Popen(['gdal_translate', 'cmd2', 'cmd3' #different settings for gdal
        , fil 
        , os.path.join(cfolder,os.path.basename(fil))] #output
        , stdout=PIPE
        , stderr=PIPE)
        childprocesses.append(p)
    for cp in childprocesses:
        cp.wait
    print ('translate complete')

После этого я пытаюсь сохранить пути вывода в списке (cfiles) и записать его в файл (temp_file). этот файл со списком файлов затем используется в другой команде gdal:

cfiles = glob.glob('{cfol}{sep}*.tif'.format(cfol=cfolder, sep=os.sep))
print (cfiles)
with open(temp_file, 'w') as f:
    for line in cfiles:
         f.write(line+'\n')
subprocess.check_output(['gdalbuildvrt',
 '-hidenodata', '-input_file_list', tempfile, outputdir])

однако, когда я запускаю весь код, он печатает строку 'translate complete' 9 раз (в моем testinput есть 9 файлов tif) и список с наборами данных. однако подпроцесс не может найти файлы:

translate complete
translate complete
translate complete
translate complete
translate complete
translate complete
translate complete
translate complete
translate complete
[]

FAILURE: No input filenames specified.  

ошибка возвращается подпроцессом gdalbuildvrt, потому что текстовый файл пуст. Я не уверен, почему это произошло. я предполагаю, что это потому, что gdal_translate не завершил создание файлов при запуске списка файлов glob.glob.

То, на что я надеялся, это дождаться завершения всех подпроцессов gdal_translate, прежде чем перечислять файлы и запустить gdalbuildvrt.

...