Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Paramiko SFTP-避免指定完整的本地文件名?_Python_Sftp_Paramiko - Fatal编程技术网

Python Paramiko SFTP-避免指定完整的本地文件名?

Python Paramiko SFTP-避免指定完整的本地文件名?,python,sftp,paramiko,Python,Sftp,Paramiko,我有一些使用Paramiko从远程服务器获取构建文件的Python代码: 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从远程服务器获取构建文件的Python代码:

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_会话中处理异常的方式,带有exit(1),这是一种好的做法,还是有更好的方法

干杯, Victor

您必须插入

os.path.join(os.getcwd(), remote_filename)
在函数中调用exit()不是一个好主意。也许您希望重用代码,并在出现异常时采取一些措施。如果保留exit()调用,则会丢失。 我建议修改此函数,以便在成功的情况下返回True,否则返回False。然后打电话的人可以决定做什么


另一种方法是不捕获异常。因此,调用者必须处理这些问题,调用者才能获得有关故障情况的完整信息(包括stacktrace)。

我只是对其进行了编码,恐怕没有找到解决方法。您需要一个本地文件名,但您可以随意调用它作为一个小sop。啊哈,酷,我将使用os.getcwd()然后=)。嗯,你关于不在函数中调用exit()的评论-我是从main调用它的。如果它无法获取文件,我需要退出我的程序-你是说我应该在main中执行该调用吗。或者有没有更好的方法让这些异常很好地退出程序?好的,如果您在main中使用exit(),情况就不同了。如果我将程序用于个人用途,我根本不会捕捉异常。因此,您将获得一个包含故障信息的堆栈跟踪。如果您将其交付给客户,我将捕获异常并将堆栈跟踪放入日志文件。