2017-08-12 75 views
1

我试图创建一个类来使用pexpect连接到框,并从该框中获取一些数据,并且我很难创建一个包含我盒子的pexpect会话的函数并为我在下面的类代码示例中创建的每个对象进行初始化。只为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 

我现在的问题是,如果我确实创造了一个新的会话会为每个对象创建一个新的对象,而且不需要我只能使用一个会话我从这个类创建的每一个对象

+0

所以我想代码工作,你只需要锻炼一个会话策略? –

+0

是的,它的工作,但我需要能够打开所有对象的一个​​pexpect连接。 – MRM

回答

2

您可以使用class methodpexpect的实例(子)连接并设置class variable。然后在这个类的实例方法可以使用类变量

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 

在实例方法中使用的self.ssh是使用类变量的类里面,如果没有分配到的方式。如果将它分配给它,则会创建一个具有相同名称的实例变量。在这种情况下,由于没有理由在本课中分配给ssh,所以这种情况不会发生。

类方法接收该类作为隐式参数,因此可以使用cls.ssh。内部的实例方法一个还可以得到对类的引用,然后使用cls.ssh

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

类变量可以在任何地方用作Comms.ssh。这是一个相当枯燥的课程。

现在使用类方法连接到主机,并通过不同的实例

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() 

[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] > 

删节什么印刷品,对于个人信息的连接应建立和输出运行命令处理得更好,但这大约是pexpect


对于类/静态方法和变量见,例如

相关问题