Paramiko SFTP - Избегать необходимости указывать полное локальное имя файла? - PullRequest
0 голосов
/ 25 августа 2011

У меня есть некоторый код Python, который использует Paramiko для получения файлов сборки с удаленного сервера:

def setup_sftp_session(self, host='server.com', port=22, username='puppy'):
    self.transport = paramiko.Transport((host, port))
    privatekeyfile = os.path.expanduser('~/.ssh/id_dsa')
    try:
        ssh_key = paramiko.DSSKey.from_private_key_file(privatekeyfile)
    except IOError, e:
        self.logger.error('Unable to find SSH keyfile: %s' % str(e))
        sys.exit(1)
    try:
        self.transport.connect(username = username, pkey = ssh_key)
    except paramiko.AuthenticationException, e:
        self.logger.error("Unable to logon - are you sure you've added the pubkey to the server?: %s" % str(e))
        sys.exit(1)
    self.sftp = paramiko.SFTPClient.from_transport(self.transport)
    self.sftp.chdir('/some/location/buildfiles')

def get_file(self, remote_filename):
    try:
        self.sftp.get(remote_filename, 'I just want to save it in the local cwd')
    except IOError, e:
        self.logger.error('Unable to find copy remote file %s' % str(e))

def close_sftp_session(self):
    self.sftp.close()
    self.transport.close()

Я бы хотел получить каждый файл и поместить его в текущий локальный рабочий каталог.

Однако у Paramiko, похоже, нет опции для этого - вам нужно указать полный локальный пункт назначения. Вы даже не можете указать каталог (например, "./" или даже "/ home / victorhooi / files") - вам нужен полный путь, включая имя файла.

Есть ли способ обойти это? Это будет раздражать, если нам нужно будет также указать локальное имя файла вместо простого копирования удаленного.

Также - способ обработки исключений в setup_sftp_session с помощью exit (1) - это хорошая практика или есть лучший способ?

Cheers, Victor

1 Ответ

1 голос
/ 25 августа 2011

Вы должны вставить

os.path.join(os.getcwd(), remote_filename)

Вызов функции exit () в функции не является хорошей идеей.Может быть, вы хотите повторно использовать код и предпринять некоторые действия в случае исключения.Если вы сохраните вызов exit (), вы потерялись.Я предлагаю изменить эту функцию так, чтобы в случае успеха возвращалось True, а в противном случае - False.Тогда вызывающая сторона может решить, что делать.

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

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