簡體   English   中英

在python提示符下發出命令后如何截獲stdout的每一行

[英]How to intercep each line of stdout after issuing a command at prompt with python

我已經寫了一個Python腳本來完成流程。

  1. 連接到LUN
  2. 安裝驅動器
  3. 將我的主驅動器備份到該LUN

以上所有內容都保存在一個日志文件中,一切都可以正常工作,但是我無法從該日志文件中獲得所需的信息。

import subprocess
from datetime import datetime
from sys import stderr

logfile="/var/tmp/home-backup.log"
TimeStamp = datetime.now().strftime("%a %d %b %Y %H:%M:%S - ")
BackStamp = datetime.now().strftime("%d-%b-%Y")
Portal = "192.168.1.59:3260"
Target = "iqn.2014-07.com.synology:fabdskst.linux-tgt1.888dddfd71"

File_obj = open(logfile, "a",0)

MyCommand = "sudo iscsiadm -m node --targetname " + Target + " --portal \"" + Portal + "\"" + " --login"
Discover = "sudo iscsiadm -d 0 -m discovery -t sendtargets -p 192.168.1.59:3260"
MyMount = "sudo mount -t ext4 -v /dev/sdc /media/linuxLUN01/"
MyBackup = "tar -cvzf /media/linuxLUN01/Mint_backup_" + BackStamp + ".tgz /home/fabrice/"

File_obj.write(TimeStamp)
subprocess.call(MyCommand, shell=True, stdout=File_obj, stderr=subprocess.PIPE)
File_obj.write(TimeStamp)
subprocess.call(MyMount, shell=True, stdout=File_obj, stderr=subprocess.PIPE)
File_obj.write(TimeStamp)
subprocess.call(MyBackup, shell=True, stdout=File_obj, stderr=subprocess.PIPE)

File_obj.close()

我希望從輸出到屏幕的輸出中的實時時間戳記為stdout的每一行(在我的情況下,stdout重定向到日志文件)。 取而代之的是,只有命令的第一個輸出帶有時間戳,其余的則沒有時間戳。

我正在學習python,所以我不是很好(您可能已經注意到我目前不進行任何測試,稍后會進行測試)。

我當時正在考慮如何解決此問題,但我只是想出一個非嚴格的解決方案,該解決方案在時間安排上並不嚴格准確;

  1. 我會在開始時節省開始時間
  2. 將所有輸出保存到一個臨時文件
  3. 我會節省時間
  4. 我將計算臨時文件中的條目數,並獲得開始時間和結束時間之間的差,然后將結果除以條目數((完成–開始)/計數)。 這將為我提供平均時間,我將用它來構建實際的日志文件
  5. 逐行讀取臨時文件,並像這樣傳輸每個條目(開始時間+((n-1)*平均時間)+“臨時文件中的行”),並將n增加到每一行的計數

有其他想法可以使此方法更准確嗎? 理想情況下,我想攔截每個stdout條目,並在輸出時為其添加時間戳。 目前,備份大約需要5分鍾。

任何建議真的不建議

根據Ram的要求,這里是日志文件的摘錄

Sat 04 Oct 2014 22:15:04 - Logging in to [iface: default, target: iqn.2014-07.com.synology:fabdskst.linux-tgt1.888dddfd71, portal: 192.168.1.59,3260] (multiple)
Login to [iface: default, target: iqn.2014-07.com.synology:fabdskst.linux-tgt1.888dddfd71, portal: 192.168.1.59,3260] successful.
Sat 04 Oct 2014 22:15:04 - Sat 04 Oct 2014 22:15:04 - /home/fabrice/
/home/fabrice/.gnome2_private/
/home/fabrice/.profile
/home/fabrice/.ICEauthority
/home/fabrice/.linuxmint/
/home/fabrice/.linuxmint/mintUpload/
/home/fabrice/.linuxmint/mintUpload/services/
/home/fabrice/Downloads/
/home/fabrice/Downloads/mshell.zip
/home/fabrice/Downloads/bash-4.3.tar.gz
/home/fabrice/Downloads/VMwareTools-9.2.4-1398046.tar.gz
/home/fabrice/Downloads/vmware-tools-distrib/
/home/fabrice/Downloads/vmware-tools-distrib/vmware-install.pl
/home/fabrice/Downloads/vmware-tools-distrib/lib/
/home/fabrice/Downloads/vmware-tools-distrib/lib/lib32/
/home/fabrice/Downloads/vmware-tools-distrib/lib/lib32/libgdkmm-2.4.so.1/
/home/fabrice/Downloads/vmware-tools-distrib/lib/lib32/libgdkmm-2.4.so.1/libgdkmm-2.4.so.1

您可以看到每個命令的輸出的第一行都帶有時間戳記

至於stderr = subprocess.PIPE,我使用它沒有特別的原因,我只是把它放在網上,就像我在網上找到的例子一樣,我仍然需要了解它的作用。

沒有經過測試的解決方案,但我相信它可以正常工作:

import subprocess as sub

[...]

with open(logfile, "a", 0) as File_obj:
    for cmd in (MyCommand, MyMount, MyBackup):
        with sub.Popen(cmd, shell=True, stdout=sub.PIPE, universal_newlines=True) as proc:
            while proc.poll() is None:
                log = [TimeStamp + line for line in proc.stdout.readlines()]
                File_obj.writelines(log)

觀察:您希望stderr輸出到終端,對嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM