2011-08-25 4 views
0

나는 원격 서버에서 파일을 구축 잡아 Paramiko를 사용하는 일부 파이썬 코드가 있습니다Paramiko SFTP - 전체 로컬 파일 이름을 지정하지 않아도됩니까?

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")도 지정할 수 없습니다. 파일 이름을 포함한 전체 경로가 필요합니다.

이 문제가 발생합니까? 원격 파일을 복사하는 대신 로컬 파일 이름을 지정해야하는 경우 성가 시게됩니다.

또한 exit (1)로 setup_sftp_session에서 예외를 처리하는 방식은 좋은 연습인가, 아니면 더 좋은 방법입니까?

건배, 빅터

+0

나는 문자 그대로이 코드를 코딩했고 그 주위에 단일 방법을 찾지 못했다. 나는 두려워한다. 로컬 파일 이름이 필요하지만 원하는대로 작은 파일로 부를 수 있습니다. – Ben

답변

1

당신이 함수에()

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

통화 종료를 삽입해야하는 것은 좋은 생각이 아니다. 코드를 재사용하고 예외가 발생하면 조치를 취할 수도 있습니다. exit() 통화를 계속하면 잃어 버리게됩니다. 이 함수를 수정하여 성공할 경우 True를 반환하고 그렇지 않으면 False로 설정하는 것이 좋습니다. 그러면 발신자가해야 할 일을 결정할 수 있습니다.

또 다른 접근법은 예외를 포착하지 않는 것입니다. 따라서 호출자는 처리해야하며 호출자는 실패 상황에 대한 전체 정보 (스택 추적 포함)를 가져옵니다.

+0

아하, 멋지다. os.getcwd(), =)를 사용하겠습니다. 흠, 함수에서 exit()를 호출하지 않는다는 것에 대한 귀하의 의견 - 저는 이것을 __main__에서 호출합니다. 파일을 가져올 수 없으면 프로그램을 종료해야합니다. __main__에서 전화를해야한다고 말하고 있습니까? 아니면 이러한 예외를 프로그램을 멋지게 종료하는 좋은 방법이 있습니까? – victorhooi

+0

다른 상황 인 main에서 exit()를 사용하면 좋습니다. 이 프로그램을 개인적인 용도로 사용한다면 예외를 전혀 잡지 못할 것입니다. 따라서 실패에 대한 정보가있는 스택 추적을 얻습니다. 고객에게 제공하는 경우 예외를 catch하고 스택 추적을 로그 파일에 저장합니다. – rocksportrocker

관련 문제