仅为 python 中的所有对象创建一个预期会话
Create one pexpect session only for all objects in python
我正在尝试创建一个 class 以使用 pexpect 连接到 box 并从该框中获取一些数据,但我很难创建一个包含我的 box 的 pexpect 会话并对其进行初始化的函数对于我在下面的 class 代码示例中创建的每个对象。
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
现在我的问题是,如果我确实创建了一个新对象,将为每个对象创建一个新会话,而这不是必需的我只能为我由此创建的每个对象使用一个会话 class
您可以为 pexpect
的实例(子)使用 class method to connect and set a class variable。然后这个 class 中的实例方法可以使用那个 class 变量
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
是一种在class中使用class变量的方法,如果它没有分配给.如果它被分配给那将改为创建一个具有相同名称的实例变量。在这种情况下,这不应该发生,因为没有理由在这个 class 中分配给 ssh
。
class 方法接收 class 作为隐式参数,因此可以使用 cls.ssh
。在实例方法中,还可以获得对 class 的引用,然后使用 cls.ssh
def cmd(self, command):
cls = self.__class__
cls.ssh.sendline(command)
...
一个class变量可以像Comms.ssh
一样在任何地方使用。这是一个相当简单的class.
现在通过不同的实例使用 class 方法和 运行 命令连接到主机
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')
print
conn_2 = Comms()
print 'With another instance object: pwd:'
print conn_2.cmd('pwd')
Comms.close()
使用真实的 userathost
,并在 [description]
中编辑了个人详细信息,这将打印
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] >
应该更好地建立连接并更好地处理输出,但仅此而已 pexpect
。
对于 class/static 方法和变量,参见
Static class variables in Python
In Python how can I access “static” class variables within class methods
Variables inside and outside of a class __init__() function
Accessing a class' member variables in Python?
我正在尝试创建一个 class 以使用 pexpect 连接到 box 并从该框中获取一些数据,但我很难创建一个包含我的 box 的 pexpect 会话并对其进行初始化的函数对于我在下面的 class 代码示例中创建的每个对象。
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
现在我的问题是,如果我确实创建了一个新对象,将为每个对象创建一个新会话,而这不是必需的我只能为我由此创建的每个对象使用一个会话 class
您可以为 pexpect
的实例(子)使用 class method to connect and set a class variable。然后这个 class 中的实例方法可以使用那个 class 变量
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
是一种在class中使用class变量的方法,如果它没有分配给.如果它被分配给那将改为创建一个具有相同名称的实例变量。在这种情况下,这不应该发生,因为没有理由在这个 class 中分配给 ssh
。
class 方法接收 class 作为隐式参数,因此可以使用 cls.ssh
。在实例方法中,还可以获得对 class 的引用,然后使用 cls.ssh
def cmd(self, command):
cls = self.__class__
cls.ssh.sendline(command)
...
一个class变量可以像Comms.ssh
一样在任何地方使用。这是一个相当简单的class.
现在通过不同的实例使用 class 方法和 运行 命令连接到主机
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')
print
conn_2 = Comms()
print 'With another instance object: pwd:'
print conn_2.cmd('pwd')
Comms.close()
使用真实的 userathost
,并在 [description]
中编辑了个人详细信息,这将打印
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] >
应该更好地建立连接并更好地处理输出,但仅此而已 pexpect
。
对于 class/static 方法和变量,参见
Static class variables in Python
In Python how can I access “static” class variables within class methods
Variables inside and outside of a class __init__() function
Accessing a class' member variables in Python?