Есть ли способ сохранить вывод команды терминала в файл с помощью Python? - PullRequest
0 голосов
/ 05 июня 2019

Я хочу сохранить вывод команды терминала top в файл, используя Python. В терминале, когда я набираю top и нажимаю ввод, я получаю вывод в режиме реального времени, поэтому он продолжает обновляться. Я хочу сохранить это в файл в течение фиксированного периода времени, а затем прекратить запись.

file=open("data.txt","w")
file.flush()
import os,time
os.system("top>>data.txt -n 1")
time.sleep(5)
exit()
file.close()

Я пытался использовать time.sleep(), а затем exit(), но это не работает, и единственный способ остановить top - в терминале с помощью Control + C Процесс продолжает выполняться, и данные постоянно записываются в файл, что не является идеальным, как можно было бы догадаться

Для ясности: я знаю, как записать вывод в файл, я просто хочу прекратить запись через период

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

system будет ждать окончания дочернего процесса. Если вы не хотите этого, Pythonic может напрямую использовать модуль подпроцесса:

import subprocess

timeout=60   # let top run for one minute
file=open("data.txt","w")
top = subprocess.Popen(["top", "-n", 1], stdout=file)
if top.wait(timeout) is None:      # wait at most timeout seconds
    top.terminate()                # and terminate child

Паноническим способом (который настоятельно рекомендуется для надежного кода) было бы использование полного пути top. Я не здесь, потому что это может зависеть от реальной системы ...

0 голосов
/ 05 июня 2019

Проблема, с которой вы можете столкнуться, заключается в том, что os.system запускает процесс как часть текущего процесса.Таким образом, остальная часть вашего сценария не будет запущена, пока команда, которую вы запускаете, не завершила выполнение.

Я думаю, что вы хотите выполнить консольную команду в другом потоке, чтобы поток, выполняющий ваш сценарий python, мог продолжить работу, пока команда выполняется в фоновом режиме.Смотрите Запустите программу Python в новом потоке для получения дополнительной информации.

Я бы предложил что-то вроде (это не проверено):

import os
import time
import multiprocessing

myThread = multiprocessing.process(target=os.system,  args=("top>>data.txt -n 1",))
myThread.start()

time.sleep(5)
myThread.terminate()

При этом,вам, возможно, придется подумать о безопасности потока в os.system (), если он не является потокобезопасным, вам нужно будет найти альтернативу.

Что-то еще, на что стоит обратить внимание (и о котором я мало что знаю)может ли не быть идеальным завершать потоки таким образом, см. некоторые ответы здесь: Есть ли способ уничтожить тему?

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