Подпроцесс Python. Открытие и асинхронный вывод - PullRequest
8 голосов
/ 28 сентября 2011

У меня есть простой скрипт Python для выполнения набора тестов как под Windows, так и под Linux. Каждый тест записывает свой вывод в отдельный файл. Я использую subprocess.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 Ответ

17 голосов
/ 28 сентября 2011

До 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...