На Python подпроцесс.Popen и асинхронный выход

У меня есть простой скрипт Python для выполнения набора тестов как под Windows, так и под Linux. Каждый тест записывает свои выходные данные в отдельный файл. Я использую подпроцесс.К popen класс для выполнения команды оболочки в цикле.

каждая команда оболочки начинается так:

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    subprocess.Popen(params_list, stdout=f)
    f.close()

Он отлично работает, но скрипт закончит свою работу до все выходные файлы были написаны. На самом деле, я получаю сотни файлов нулевого размера, и требуется некоторое время, чтобы закончить писать вывод и закрытие ручек. Может ли кто-нибудь объяснить причину, почему он работает так странно, и есть ли синхронный способ выполнить ту же работу?

спасибо

1 ответов


до f.close() вы должны wait() для наших подпроцесса.

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    sp = subprocess.Popen(params_list, stdout=f)
    sp.wait()
    f.close()

или просто

def system_execute(self, command, path, out_file):
    params_list = command.split(' ') 
    file_path = os.path.join(path, out_file)
    f = open(file_path, "w")
    subprocess.call(params_list, stdout=f)
    f.close()

(или, для облегчения обработки файлов,

[...]
    with open(file_path, "w") as f:
        subprocess.call(params_list, stdout=f)