Мне нужно работать с удаленными файлами прозрачно, как если бы они были локальными файлами в некотором питонном коде, который я пишу, поэтому я решил использовать SFTP для этой задачи. Следующий пример кода работает (он печатает первую строку удаленного файла):Создание класса многократного использования в python
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='192.168.8.103', username='root', password='pyjamas')
sftp = client.open_sftp()
test = sftp.open('/var/log/example/ingest.log', mode='r', bufsize=1)
print test.readline()
я собираюсь подключаться ко многим файлам, поэтому я решил написать класс, который дает мне объект SFTPFile. Изучите следующий код:
import paramiko
class RemoteLog(object):
"""This class implements the remote log buffer."""
def __init__(self, host, user='', pw='', log=''):
"""Initializes a connection to a remote log."""
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=host, username=user, password=pw)
sftp = client.open_sftp()
self.log = sftp.open(log, mode='r', bufsize=1)
if __name__ == "__main__":
test = RemoteLog(host='192.168.8.103', user='root', pw='pyjamas', log='/var/log/example/ingest.log')
print test.log.readline()
К сожалению, readline() в этом сценарии ничего не возвращает. Нет никаких ошибок или очевидных объяснений.
Как воспроизвести функциональность из моего первого фрагмента кода в класс многократного использования?
Попробуйте использовать ссылку sftp и client ('self.client = paramiko ...' и 'self.sftp = self.client.open_sftp()'). Мое единственное предположение: когда они выходят из сферы действия, они автоматически очищают и закрывают соединение. – gfortune
, если вы добавите 'print self.log.readline()' inside '__init__', вы получаете то, что ищете? @gfortune та же идея :-) – Simon
@gfortune: похоже, это сделано! Похоже, что они очистили соединение после потери объема, проверка этого соединения на другом конце показала бы это. – Stealthii