2013-05-17 35 views
0

我在寫一個Python腳本,它將ssh放入一個框中(使用parakimo)並運行命令。我想爲stdout/stderr創建一個對象並打印輸出。閱讀列表元素的Python類,__ str__和類問題

  1. 我是否正確地將名單傳遞給類?我是否正確地在課堂上遞交了 列表?

  2. 我想利用__str__方法,所以我可以打印(對象)。 我該如何正確地做到這一點?

  3. 我打算使用這個類的2個實例,因爲我會做2 單獨的sss.exec_command(命令)。我是否在課堂上把這個功能包裝起來,浪費記憶力 ?我想利用OO來高效組織並嘗試利用python的面向對象功能。
class read_log: 
    def __init__(self, exit_status, *tuple_list): 
     self.exit_status = exit_status 
     self.tuple_list = tuple_list 
     if exit_status: 
      output = stderr.readlines() 
     else: 
      output = stdout.readlines() 
      del output[0] 
      del output[-1] 
    def __str__(self) 
     return ''.join(output)  

def create(): 
    stdin, stdout, stderr=ssh.exec_command("/home/one/script.sh") 
    exit_status = stdout.channel.recv_exit_status() 
    x = readlog(exit_status, stdin, stdout, stderr) 
    print(x) 

回答

1

您捕捉stdinstdoutstderr輸入,一個包羅萬象的說法,但隨後嘗試在__init__功能再次提及這些名稱。

只是讓他們單獨的參數:

class read_log: 
    def __init__(self, exit_status, stdin, stdout, stderr): 
     self.exit_status = exit_status 
     self.tuple_list = (stdin, stdout, stderr) 

使用*args語法當你需要允許的參數個數可變,不捕的,你那麼否則不能使用參數固定數量。無論如何,我將3個參數作爲一個元組存儲到您的實例中,以防您在其他地方使用self.tuple_list

您需要存儲output的實例:

if exit_status: 
    self.output = stderr.readlines() 
else: 
    self.output = stdout.readlines() 
    del self.output[0] 
    del self.output[-1] 

__str__指的是實例屬性:

def __str__(self) 
    return ''.join(self.output) 

後者del語句也可以用切片代替:

if exit_status: 
    self.output = stderr.readlines() 
else: 
    self.output = stdout.readlines()[1:-1] 
+1

tuple_list不會奇蹟般地翻譯e進入std *對象或者... – marcoseu

+0

@marcoseu:好點,解決。 –

+0

我不斷收到<__ main __。0x7f39fd648878> ReadLog實例>。爲什麼是這樣?順便說一下,我將類名改爲ReadLog而不是read_log。另外,std *對象究竟是什麼? – dman