IOError:[Errno 2]没有这样的文件 - Paramiko put()

Cia*_*ian 6 python sftp paramiko python-2.7

我使用的是通过SFTP上传文件的paramikosftp.put(localFile, remoteFile).如果需要,我首先制作必要的目录

    makeCommand = 'mkdir -p "' + remotePath + '"'
    ssh.exec_command(makeCommand)
Run Code Online (Sandbox Code Playgroud)

这有时是有效的,但我偶尔会收到以下错误:

    sftp.put(localFile, remoteFile)
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 565, in put
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 245, in open
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 635, in _request
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 682, in _read_response
    File "build/bdist.macosx-10.8-intel/egg/paramiko/sftp_client.py", line 708, in _convert_status
    IOError: [Errno 2] No such file 
Run Code Online (Sandbox Code Playgroud)

尽管本地文件肯定存在(并且localFile是正确的路径)并且建立了远程路径.这里这里有一个类似问题的讨论,但那里提到的任何一点都没有帮助我.我的服务器支持该df -hi命令.有没有人对此或任何可能的解决方案有任何建议?

编辑

在下面的建议后,我尝试更改工作目录,sftp.chdir(remoteDirectory)但此调用产生了与上面完全相同的错误.所以这似乎不仅仅是一个上传问题.有任何想法吗?

Cia*_*ian 7

它似乎是一个远程文件夹权限问题.虽然远程文件夹是在文件上载之前制作的,但是文件夹上的权限似乎阻止了上传.

问题与问题有关 - 如果我在上传之前对我要上传的文件夹设置了开放权限,程序可以正常上传.虽然我应该得到一个权限问题IOError: [Errno 13] Permission denied,因为我做了更改后没有遇到任何错误.

我不确定这是服务器给Paramiko的响应是什么问题,或Paramiko本身的错误导致IOError: [Errno 2] No such file而不是a Errno 13,但这似乎已经解决了问题.


Tim*_*mah 5

put 方法有一个默认启用的确认参数,它将在传输后对文件进行统计。

在我的情况下,我将文件传输到的远程服务器立即将任何传输的文件移动到另一个位置以进行处理,这导致统计失败。将确认参数设置为 False 解决了这个问题。

def put(self, localpath, remotepath, callback=None, confirm=True):
Run Code Online (Sandbox Code Playgroud)

来自 paramiko 源 sftp_client.py:

:param bool confirm: 之后是否对文件执行 stat() 以确认文件大小(自 1.7.7 起)

  • 我的天啊。这绝对是我一直在寻找的!我的远程服务器立即将所有传输的文件移动到另一个位置,我面临着同样的问题。太感谢了! (2认同)