На 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)