Как сохранить выходные данные команд os в текстовом файле? - PullRequest
1 голос
/ 20 мая 2019

Я пытаюсь написать скрипт, который использует команду os (linux) и сохранить их в текстовом файле. Но когда я пытаюсь запустить этот код, вывод команды os не сохраняется в текстовом файле.

#!/usr/bin/python
import sys
import os


target = raw_input('Enter the website : ')
ping_it = os.system('ping ' + target)
string_it = str(ping_it)

with open("Output.txt", "w+") as fo:
        fo.write(string_it)
        fo.close()

После запуска сценария, когда я проверяю txt файл, единственное, что я получаю, это номер 2 в файле Output.txt.

Ответы [ 3 ]

2 голосов
/ 20 мая 2019

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

0 голосов
/ 20 мая 2019

Из документов вы можете использовать os.popen, чтобы назначить вывод любой команды для переменной.

import os
target = raw_input('Enter the website : ')

output = os.popen('ping ' + target).read()   # Saving the output

with open('output.txt', 'w+') as f:
    f.write(output)
0 голосов
/ 20 мая 2019

Что именно вы пытаетесь сохранить в файле? Вы сделали сохранить вывод os.command, который является не чем иным, как окончательным статусом выполнения. Это именно то, что говорит вам документация, это возвращаемое значение этой команды.

Если вы хотите получить вывод команды ping, вам нужно использовать что-то, что фокусируется на ping, а не на os.command. Простой способ - добавить перенаправление UNIX:

os.system('ping ' + target + '&> Output.txt')

Если вы чувствуете необходимость передать результаты через Python, используйте отдельный процесс и получите результаты команды; см. Здесь .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...