SFTP-файл Parmiko - вызов .next () немедленно вызывает StopIteration, даже с оставшимися строками - PullRequest
0 голосов
/ 15 ноября 2011

Я пытаюсь использовать Paramiko (библиотека Python SSH) для чтения удаленного файла и перебора строк.

Мой файл выглядит примерно так:

# Instance Name      VERSION               COMMENT
Bob                  1.5                   Bob the Builder
Sam                  1.7                   Play it again, Sam

Мой код Paramiko выглядит примерно так:

def get_instances_cfg(self):
    '''
    Gets a file handler to the remote instances.cfg file.
    '''
    transport = paramiko.Transport(('10.180.10.104', 22))
    client = paramiko.SSHClient()
    #client.load_system_host_keys()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect('some_host', username='victorhooi', password='password')
    sftp = client.open_sftp()
    fileObject = sftp.file('/tmp/instances.cfg','r')
    return fileObject

def get_root_directory(self):
    '''
    Reads the global instances.cfg file, and returns the instance directory.
    '''
    self.logger.info('Getting root directory')
    instances_cfg = self.get_instances_cfg()
    first_line = instances_cfg.next() # We skip the header row.
    instances = {}
    for row in instances_cfg:
        name, version, comment = row.split(None, 2)
        aeg_instances[name] = {
            'version': version,
            'comment': comment,
        }

По какой-то причине, когда я запускаю вышеописанное, я получаю ошибку StopIteration при запуске .next () в обработчике файла SFTP:

first_line = instances_cfg.next() # We skip the header row.
File "/home/hooivic/python2/lib/python2.7/site-packages/paramiko/file.py", line 108, in next
raise StopIteration
StopIteration

Это странно, потому что текстовый файл экземпляров, который я читаю, содержит три строки - я использую .next (), чтобы пропустить строку заголовка.

Когда я открываю файл локально, с помощью Python open (), .next () работает нормально.

Кроме того, я могу перебрать обработчик SFTP-файлов, и он напечатает все три строки.

И использование .readline () вместо .next (), кажется, тоже работает нормально - не уверен, почему .next () не играет хорошо.

Это какая-то особенность обработчика SFTP-файлов Paramiko или я что-то упустил в приведенном выше коде?

Ура, Victor

1 Ответ

0 голосов
/ 29 ноября 2011

Функция next() просто вызывает readline() для внутреннего использования. only вещь, которая может вызвать StopIteration, - это если readline вернул пустую строку (посмотрите на код, это 4 строки).

Посмотрите, что возвращает readline() для вашего файла. Если он возвращает пустую строку, должна быть ошибка в алгоритме буферизации строки, используемом paramiko.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...