Python работает синхронно? Запуск одного исполняемого файла за раз

Попытка использовать python для управления многочисленными скомпилированными исполняемыми файлами, но столкнулась с проблемами временной шкалы! Мне нужно иметь возможность запускать два исполняемых файла одновременно, а также уметь "ждать", пока исполняемый файл не завершится, прежде чем запускать другой. Также некоторые из них требуют суперпользователя. Вот что у меня так далеко:

import os
sudoPassword = "PASS"
executable1 = "EXEC1"
executable2 = "EXEC2"
executable3 = "EXEC3"
filename = "~/Desktop/folder/"
commandA = filename+executable1
commandB = filename+executable2
commandC = filename+executable3
os.system('echo %s | sudo %s; %s' % (sudoPassword, commandA, commandB))
os.system('echo %s | sudo %s' % (sudoPassword, commandC))
print ('DONESIES')

Предполагая, что os.system() ожидает завершения исполняемого файла, прежде чем перейти к следующей строке, он должен запускать EXEC1 и EXEC2 одновременно, а после того, как они завершат запуск EXEC3... Но это не так. На самом деле, он даже печатает 'DONESIES' в оболочке до того, как команда B даже завершает работу... Пожалуйста, помогите!

2 ответа

Используйте subprocess.Popen для запуска нескольких команд в фоновом режиме. Если вы просто хотите, чтобы stdout/err программы перешел на экран (или был полностью сброшен), это довольно просто. Если вы хотите обработать вывод команд... это становится более сложным. Вы, вероятно, запустите поток для каждой команды.

Но вот случай, который соответствует вашему примеру:

import os
import subprocess as subp

sudoPassword = "PASS"
executable1 = "EXEC1"
executable2 = "EXEC2"
executable3 = "EXEC3"
filename = os.path.expanduser("~/Desktop/folder/")
commandA = os.path.join(filename, executable1)
commandB = os.path.join(filename, executable2)
commandC = os.path.join(filename, executable3)

def sudo_cmd(cmd, password):
    p = subp.Popen(['sudo', '-S'] + cmd, stdin=subp.PIPE)
    p.stdin.write(password + '\n')
    p.stdin.close()
    return p

# run A and B in parallel
exec_A = sudo_cmd([commandA], sudoPassword)
exec_B = sudo_cmd([commandB], sudoPassword)

# wait for A before starting C
exec_A.wait()
exec_C = sudo_cmd([commandC], sudoPassword)

# wait for the stragglers
exec_B.wait()
exec_C.wait()

print ('DONESIES')

Ваш скрипт по-прежнему будет выполнять все 3 команды последовательно. В сценариях оболочки точка с запятой - это просто способ поместить более одной команды в одну строку. Он не делает ничего особенного, он просто запускает их один за другим.

Если вы хотите запускать внешние программы параллельно с программой Python, используйте subprocess модуль: https://docs.python.org/2/library/subprocess.html

Другие вопросы по тегам