Python类继承,缺少属性

问题描述:

我学习Python和Python的脚本在我的学习道路运行远程SSH命令 脚本本身运行正常,但它打破当我要进行实验类继承功能。Python类继承,缺少属性

原创剧本pyssh.py:

#!/usr/bin/env python 
import sys 
import socket 
import paramiko 
#================================= 
# Class: PySSH 
#================================= 
class PySSH: 


    def __init__ (self): 
     self.ssh = None 
     self.transport = None 

    def disconnect (self): 
     if self.transport is not None: 
      self.transport.close() 
     if self.ssh is not None: 
      self.ssh.close() 

    def connect(self,hostname,username,password,port=22): 
     self.hostname = hostname 
     self.username = username 
     self.password = password 

     self.ssh = paramiko.SSHClient() 
     #Don't use host key auto add policy for production servers 
     self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
     self.ssh.load_system_host_keys() 
     try: 
      self.ssh.connect(hostname,port,username,password) 
      self.transport=self.ssh.get_transport() 
     except (socket.error,paramiko.AuthenticationException) as message: 
      print "ERROR: SSH connection to "+self.hostname+" failed: " +str(message) 
      sys.exit(1) 
     return self.transport is not None 

    def runcmd(self,cmd,sudoenabled=False): 
     if sudoenabled: 
      fullcmd="echo " + self.password + " | sudo -S -p '' " + cmd 
     else: 
      fullcmd=cmd 
     if self.transport is None: 
      return "ERROR: connection was not established" 
     session=self.transport.open_session() 
     session.set_combine_stderr(True) 
     #print "fullcmd ==== "+fullcmd 
     if sudoenabled: 
      session.get_pty() 
     session.exec_command(fullcmd) 
     stdout = session.makefile('rb', -1) 
     #print stdout.read() 
     output=stdout.read() 
     session.close() 
     return output 

#=========================================== 
# MAIN 
#===========================================   
if __name__ == '__main__': 
    hostname = 'server1' 
    username = 'admin' 
    password = 'Password123' 
    ssh = PySSH() 
    ssh.connect(hostname,username,password) 
    output=ssh.runcmd('date') 
    print output 
    output=ssh.runcmd('service sshd status',True) 
    print output 
    ssh.disconnect() 

现在我想用拧干的新脚本pyssh2.sh

#!/usr/bin/env python 
from pyssh import PySSH 
class PySSHT(PySSH): 
    def connect(self,hostname): 
     self.ssh = PySSH() 
     self.username = 'admin' 
     self.password = 'Password1' 
     self.ssh.connect(hostname,self.username,self.password) 

host = 'server1' 
ssh = PySSHT() 
ssh.connect(host) 
output=ssh.runcmd('date') 
print output 
output=ssh.runcmd('service sshd status',True) 
print output 
ssh.disconnect() 

它给了这个错误,测试类的继承,看来自我的价值。在ssh.connect()中分配的传输在runcmd()中丢失。有没有简单的类继承规则我缺少?

[[email protected] ~]# ./pyssh2.py 
ERROR: connection was not established 
ERROR: connection was not established 
Traceback (most recent call last): 
    File "./pyssh2.py", line 17, in <module> 
    ssh.disconnect() 
    File "/root/pyssh.py", line 19, in disconnect 
    self.ssh.close() 
AttributeError: PySSH instance has no attribute 'close 
+0

为了工作,你应该改变你的最后一行'ssh.disconnect()''到ssh.ssh.disconnect()'。 – snahor 2014-10-30 02:05:31

看起来你的问题是在这里:

class PySSHT(PySSH): 
    def connect(self,hostname): 
     self.ssh = PySSH() # <=== problem here? 
     self.username = 'admin' 
     self.password = 'Password1' 
     self.ssh.connect(hostname,self.username,self.password) 

在第一个代码块中,第二块(上面)设置self.ssh到paramiko.SSHClient() 您设置到PySSH

我认为paramiko.SSHClient有.close方法。 PySSH没有。

你不应该设置self.ssh到PySSH我不认为。 更好的方法是这样的:

class PySSHT(PySSH): 
    def connect(self, hostname): 
     PySSH.connect(self, hostname = hostname, username = 'admin', password = 'Password1') 
     return 

你也应该对旧式VS新式类在Python阅读起来。 PySSH或许应该得到声明:

class PySSH(object): 
+0

谢谢,它解决了这个问题。它是在类的继承基本的,我不应该创建一个实例 – honglus 2014-10-30 03:09:51

+0

好。还应该补充一点,你可以使用super()来避免显式地引用基类。 http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods – 2014-10-30 03:21:30

+0

我会检查,是否有其他房间在pyssh.py脚本改进?鉴于这是我第一次Python脚本 – honglus 2014-10-30 03:36:49