2017-12-18 12 views
-1

私はJavaで学んだのと同じ方法でOO Pythonコードを書こうとしています。それはおそらく私が南に行くところです。私は主なスクリプトと他の人が書いたクラスを持っています。私はメインのスクリプトのクラスを呼び出しますが、私が使うすべてのテクニックは[クラス名]を呼び出すことはできません。Pythonクラスが呼び出し可能でないのはなぜですか?

以下は最新の試みです。これがメインスクリプトです。変数directoryPairsはセキュリティのために削除されました。以下は

import yaml 
import pysftp 
import FingerprintKey 

with open('config/config.yaml') as settings: 
    cfg = yaml.load(settings) 

host = cfg['host'] 
username = cfg['username'] 
password = cfg['password'] 
serverkey = cfg['fingerPrint'] 

x = FingerprintKey(serverkey) 

options = pysftp.CnOpts() 
options.hostkeys.clear() 
options.hostkeys.add('www.example.com', u'ecdsa-sha2-nistp384', x) 

with pysftp.Connection(host, username=username, password=password, cnopts=options) as sftp: 
    #for source, destination in directoryPairs.items(): 
     #sftp.get_d(source, destination, preserve_mtime=True) 
     #if sftp.exists(source): 
      #files = sftp.listdir(source) 
      #for f in files: 
       #sftp.remove(os.path.join(source, f)) 
    sftp.close() 

は、これらのファイルの

import hashlib as hl 


def trim_fingerprint(fingerprint): 
    if fingerprint.startswith('ecdsa-sha2-nistp384 384 '): 
     return fingerprint[len('ecdsa-sha2-nistp384 384 '):] 
    return fingerprint 


def clean_fingerprint(fingerprint): 
    return trim_fingerprint(fingerprint).replace(':', '') 


class FingerprintKey: 

    def __init__(self, fingerprint): 
     self.fingerprint = clean_fingerprint(fingerprint) 

    def compare(self, other): 
     if callable(getattr(other, "get_fingerprint", None)): 
      return other.get_fingerprint() == self.fingerprint 
     elif clean_fingerprint(other) == self.get_fingerprint(): 
      return True 
     elif hl.md5(other).digest().encode('hex') == self.fingerprint: 
      return True 
     else: 
      return False 

    def __cmp__(self, other): 
     return self.compare(other) 

    def __contains__(self, other): 
     return self.compare(other) 

    def __eq__(self, other): 
     return self.compare(other) 

    def __ne__(self, other): 
     return not self.compare(other) 

    def get_fingerprint(self): 
     return self.fingerprint 

    def get_name(self): 
     return u'ecdsa-sha2-nistp384' 

    def asbytes(self): 
     # Note: This returns itself. 
     # That way when comparisons are done to asbytes return value, 
     # this class can handle the comparison. 
     return self 

両方が同じディレクトリにあるFingerprintKey.pyクラスです。

+1

をAuthOnFingerPrintするクラスファイルの名前を変更し、 'FingerprintKey'は、その名前のモジュールを指します。そのモジュール内の(同じ名前の)クラスは、「FingerprintKey.FingerprintKey」と呼ばれます。 – mkrieger1

+0

OH! OK。だから、Javaのようにファイル名をクラスと同じにする必要はありません。 –

答えて

0

mkrieger1のおかげで、以下のコードを追加して動作させました。

私はあなたのメインのスクリプトでは

import AuthOnFingerPrint 
options.hostkeys.add('www.example.com', u'ecdsa-sha2-nistp384 384 ', AuthOnFingerPrint.FingerprintKey(serverkey)) 
関連する問題