Добро пожаловать в Stackoverflow.
Основная проблема здесь заключается в том, что os.system
не предназначен для создания выходных данных команды - он просто запускает ее, и процесс отправляет свои выходные данные тому, что он наследует от своего родителя (вашей программы).
Для захвата выходных данных проще всего использовать модуль subprocess
, который позволяет захватывать выходные данные процесса.
Вот довольно простая программа, которая поможет вам начать:
import subprocess
target = 'google.com'
ping_it = subprocess.Popen('ping ' + target,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out, err = ping_it.communicate()
with open("Output.txt", "w+") as fo:
fo.write(str(out))
fo.close()
Если вы хотите читать выходные данные в том виде, в котором они созданы, а не ждать завершения подпроцесса, вы можете использовать один канал subprocess.PIPE
и читать из него, что удобно выражать в таких формах:
with Popen(["ping", "google.com"], stdout=PIPE) as proc:
print(proc.stdout.read())
В этом примере я выбрал команду в виде списка аргументов, а не в виде простой строки. Это позволяет избежать необходимости объединять аргументы в строку, если они уже находятся в форме списка.
Обратите внимание, что при таком взаимодействии с подпроцессами подпроцесс может оказаться в заблокированном состоянии, поскольку либо stdout, либо stderr заполнили свое пространство выходного буфера. Если ваша программа затем пытается прочитать с другого канала, который создаст тупик, где каждый процесс ждет, пока другой что-то сделает. Чтобы избежать этого, вы можете сделать stderr временным файлом, а затем проверить после завершения подпроцесса, что файл не содержит ничего значимого (и, в идеале, удалить его).