Python subprocess () ожидает завершения последней команды в серии - PullRequest
1 голос
/ 25 июня 2019

Часть моего кода показана следующим образом.Цикл for запускает кучу команд оболочки, которые я хочу, чтобы они выполнялись параллельно.Но затем, после этого цикла for, у меня есть некоторые команды, которые должны выполняться только тогда и только тогда, когда все эти процессы, запущенные во время цикла for, выполнены.Есть способ сделать это?Если я использую wait () для каждого процесса, то эти процессы будут просто выполняться последовательно, а не параллельно.

#split the bedgraph file by chromName
bedfile_list = (options.filename).split(',')
bed1,bed2 = bedfile_list[0],bedfile_list[1]
subgenome_name_list = (options.subgenome_name).split(',')
sub1,sub2 = subgenome_name_list[0],subgenome_name_list[1]
for chromosome in chrom:
    #os.system('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed1, sub1, chromosome))
    #os.system('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed2, sub2, chromosome))
    p1 = subprocess.Popen('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed1, sub1, chromosome),shell=True)
    p2 = subprocess.Popen('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed2, sub2, chromosome),shell=True)



subprocess.Popen('rm *.temp')

1 Ответ

2 голосов
/ 25 июня 2019

Конечно!Просто сохраните ваши всплывающие объекты, затем вы можете проверить их все на предмет завершения, прежде чем двигаться дальше:

# create an empty list to add all of the popen objects to
processes = []

for chromosome in chrom:
    p1 = subprocess.Popen('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed1, sub1, chromosome),shell=True)
    p2 = subprocess.Popen('grep \'{}\' {} > {}.{}.temp'.format(chromosome, bed2, sub2, chromosome),shell=True)

    # stash the popen objects for later use
    processes.append(p1)
    processes.append(p2)

# before moving on, call wait() on all of the objects to ensure they're done
# this is a blocking call, so the loop won't complete until all processes have returned
for p in processes:
    p.wait()

# now do your post processing work
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...