2017-08-12 2 views
1

J'essaie de créer une classe pour me connecter à la boîte en utilisant pexpect et récupérer des données de cette boîte, et j'ai du mal à créer une fonction contenant la session pexpect pour ma boîte et l'initialise pour chaque objet que je crée dans l'exemple de code de classe ci-dessous.Créer une seule session pour tous les objets en python

class A: 
    def __init__(self) 
     # in this way a session will be created for each object and i don't 
     # need that i need only one session to open for any object created. 
     session = pexpect.spawn('ssh myhost') 
     session.expect('[email protected]#') 

    def get_some_data(self,command) 
     session.sendline(command) 
     session.expect('[email protected]#') 
     list = session.before.splitlines() 
     return list 

maintenant mon problème est que si je créer un nouvel objet une nouvelle session sera créée pour chaque objet, et ce n'est pas nécessaire que je peux utiliser qu'une seule session pour chaque objet que je crée de cette classe

+0

Je suppose que le code fonctionne, il vous suffit de séance d'entraînement d'une stratégie unique de la session? –

+0

Oui, ça marche mais j'avais besoin de pouvoir ouvrir une connexion pexpect pour tous les objets. – MRM

Répondre

2

Vous pouvez utiliser un class method pour vous connecter et définir un class variable pour l'instance pexpect (enfant). Ensuite, les méthodes d'instance de cette classe peuvent utiliser cette variable classe

import pexpect 

class Comms: 
    Is_connected = False 
    Name = None 
    ssh = None 

    @classmethod 
    def connect(cls, name): 
     cls.Name = name 
     cls.ssh = pexpect.spawn('ssh ' + name) 
     cls.ssh.expect('password:') 
     cls.ssh.sendline('*****') 
     cls.ssh.expect('> ') 
     print cls.ssh.before, cls.ssh.after 
     cls.Is_connected = True 

    @classmethod 
    def close(cls): 
     cls.ssh.close() 
     cls.ssh, cls.Is_connected = None, False 

    def check_conn(self): 
     print self.Name + ' is ' + str(self.Is_connected) 
     return self.Is_connected 

    def cmd(self, command): 
     self.ssh.sendline(command) 
     self.ssh.expect('> ') 
     return self.ssh.before + self.ssh.after 

Le self.ssh utilisé dans les méthodes d'instance est un moyen d'utiliser une variable de classe à l'intérieur de la classe, si elle est pas affecté à. Si elle était affectée à cela, créer une variable d'instance avec le même nom. Dans ce cas, cela ne peut pas arriver car il n'y a aucune raison d'assigner ssh dans cette classe.

Une méthode de classe reçoit la classe en tant qu'argument implicite, de sorte que cls.ssh peut être utilisée. A l'intérieur d'une méthode d'instance, on peut également obtenir une référence à la classe, puis utiliser cls.ssh

def cmd(self, command): 
    cls = self.__class__ 
    cls.ssh.sendline(command) 
    ... 

Une variable de classe peut être utilisée partout comme Comms.ssh. C'est une classe plutôt dénudée.

Maintenant vous connecter à un hôte en utilisant la méthode de classe et d'exécuter des commandes par différentes instances

from comms import Comms 

userathost = '[email protected]' 

print 'Connect to ' + userathost 
Comms.connect(userathost) 

conn_1 = Comms() 
conn_1.check_conn() 
print conn_1.cmd('whoami') 
print 

conn_2 = Comms() 
print 'With another instance object: pwd:' 
print conn_2.cmd('pwd') 

Comms.close() 

ce impressions, expurgée de données personnelles dans [description]

 
Connect to [email protected] 

Last login: Sat Aug 12 01:04:52 2017 from ***** 
[... typical greeting on this host] 
[my prompt] > 
[email protected] is True 
whoami 
[my username] 
[my prompt] > 

With another instance object: pwd: 
pwd 
[path to my home] 
[my prompt] > 

La connexion doit être mis en place et la sortie traité plus gentiment, mais c'est à peu près pexpect.


Pour les méthodes de classe/statiques et des variables voir, par exemple