2016-10-10 13 views
0

Insgesamt noob hier. Ich versuche, ein Python-Objekt zu erstellen und Methoden in einer Instanz darin auszuführen, und es scheint, dass der Code-Block, den ich ausführen möchte, einfach nicht ausgeführt wird. Der fragliche Codeblock ist run_job, der, wenn er aufgerufen wird, scheinbar nichts zu tun hat. Was mache ich falsch?Python-Methode nicht ausgeführt

import datetime 
import uuid 
import paramiko 


class scan_job(object): 

    def __init__(self, protocol, target, user_name, password, command): 
     self.guid = uuid.uuid1() 
     self.start_time = datetime.datetime.now() 
     self.target = target 
     self.command = command 
     self.user_name = user_name 
     self.password = password 
     self.protocol = protocol 
     self.result = "" 

    def run_job(self): 
     if self.protocol == 'SSH': 
      ssh = paramiko.SSHClient() 
      ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
      try: 
       print "creating connection" 
       ssh.connect(self.target, self.user_name, self.password) 
       print "connected" 
       stdin, stdout, stderr = ssh.exec_command(self.command) 
       for line in stdout: 
        print '... ' + line.strip('\n') 
        self.result += line.strip('\n') 
       yield ssh 
      finally: 
       print "closing connection" 
       ssh.close() 
       print "closed" 

     else: 
      print "Unknown protocol" 

    def show_command(self): 
     print self.command 


test = scan_job('SSH', '192.168.14.10', 'myuser', 'mypassword', 'uname -n') 

test.show_command() 

test.run_job() 
+0

Sie haben eine Generator-Methode geschrieben, mit einer 'Yield' Aussage. Wolltest du das machen? Generatoren erstellen faule Iterables. –

+0

Entfernen Sie den 'Ertrag ssh'. Ich weiß nicht, warum du es dort hast. –

Antwort

0

Ihre Methode enthält eine yield-Anweisung, die sie zu einem Generator macht. Generatoren werden träge bewertet. Überlegen Sie:

>>> def gen(): 
... yield 10 
... yield 3 
... yield 42 
... 
>>> result = gen() 
>>> next(result) 
10 
>>> next(result) 
3 
>>> next(result) 
42 
>>> 

Dies ist wahrscheinlich nicht das, was Sie vorhatten.

+1

Warum der Downvote? –

+0

war ich nicht aber raten, weil es die Frage nicht beantwortet. Ich sehe, Sie haben etwas über Generatoren gesagt, aber wie hängt das mit dem OP-Problem zusammen? –

+0

@PaulRooney können Sie wirklich nicht schließen, oder meinen Sie, dass ich expliziter sein sollte? –

0

Ausbeute ist ein Schlüsselwort, das wie Rückkehr verwendet wird, außer die Funktion wird einen Generator zurückgeben.
1) Understanding Generators in Python
2) What does the "yield" keyword do in Python?
3) Understanding the Yield Keyword in Python

Alles, was Sie tun müssen, ist, zu ändern:

Um mehr über Generatoren zu lesen

yield ssh 

An:

return ssh 

Also wird run_job wie eine normale Funktion ausgeführt, bis es sein Ende erreicht, Ausnahme oder return-Anweisung. Wenn Sie es jedoch ausführen möchten, ohne die Yield-Anweisung zu ändern. Hier ist, wie Sie es tun können:

x = test.run_job() 
x.next()