Create one session only for all objects in python
我正在尝试使用pexpect创建一个类来连接到box,并从该框中获取一些数据,我很难创建一个函数,该函数包含我的box的pexpect会话,并为我在下面的类代码示例中创建的每个对象初始化它。
1 2 3 4 5 6 7 8 9 10 11 12 | 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('myname@myhost#') def get_some_data(self,command) session.sendline(command) session.expect('myname@myhost#') list = session.before.splitlines() return list |
现在我的问题是,如果我真的创建了一个新的对象,将为每个对象创建一个新的会话,而这不是必需的,我只能为从这个类创建的每个对象使用一个会话。
您可以使用类方法来连接和设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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 |
实例方法中使用的
类方法将类作为隐式参数接收,因此可以使用
1 2 3 4 | def cmd(self, command): cls = self.__class__ cls.ssh.sendline(command) ... |
类变量可以作为
现在使用class方法连接到主机并通过不同的实例运行命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from comms import Comms userathost = 'xxx@xxxxx' print 'Connect to ' + userathost Comms.connect(userathost) conn_1 = Comms() conn_1.check_conn() print conn_1.cmd('whoami') conn_2 = Comms() print 'With another instance object: pwd:' print conn_2.cmd('pwd') Comms.close() |
在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | Connect to xxx@xxxxx Last login: Sat Aug 12 01:04:52 2017 from ***** [... typical greeting on this host] [my prompt] > xxx@xxxxx is True whoami [my username] [my prompt] > With another instance object: pwd: pwd [path to my home] [my prompt] > |
连接应该设置得更好,输出处理得更好,但这是关于
有关类/静态方法和变量的信息,请参见
python中的静态类变量
在Python中,如何访问类方法中的"静态"类变量
类__init_uu()函数内部和外部的变量
在Python中,"类方法"和"实例方法"是什么?
在python中访问类的成员变量?