如果 SFTP 服务器触发在上传时自动移动文件,Paramiko put 方法将抛出“[Errno 2] File not found”

Paramiko put method throws "[Errno 2] File not found" if SFTP server has trigger to automatically move file upon upload

我正在调用 Paramiko sftp_client.put(locapath,remotepath) 方法

这是抛出下面的 [Errno 2] 文件未找到错误。

01/07/2020 01:12:03 PM - ERROR - [Errno 2] File not found
Traceback (most recent call last):
  File "file_transfer\TransferFiles.py", line 123, in main
  File "paramiko\sftp_client.py", line 727, in put
  File "paramiko\sftp_client.py", line 689, in putfo
  File "paramiko\sftp_client.py", line 460, in stat
  File "paramiko\sftp_client.py", line 780, in _request
  File "paramiko\sftp_client.py", line 832, in _read_response
  File "paramiko\sftp_client.py", line 861, in _convert_status

尝试了许多其他推荐的修复后,我发现错误是由于服务器有一个自动触发器,在文件上传后立即将文件移动到另一个位置。

我还没有看到与此问题相关的另一个 post,并且想知道是否有其他人修复了此问题,因为 SFTP 服务器归第三方所有并且不想更改触发器属性。

文件实际上上传正确,所以我可以捕获异常并忽略错误。但如果可能的话,我更愿意处理它。

Paramiko 默认在上传后验证上传文件的大小。

如果文件在上传后立即被移走,则检查失败。

要避免检查,请将 SFTPClient.putconfirm 参数设置为 False

sftp_client.put(localpath, remotepath, confirm=False)

我认为无论如何检查都是多余的,请参阅
How to perform checksums during a SFTP file transfer for data integrity?


有关 pysftp(什么是 Paramiko 的包装器)的类似问题,请参阅:

还有这个问题,在 paramiko 可以对上传的文件执行 os.stat 并比较本地和上传的文件大小之前,文件会自动移动。

@Martin_Prikryl 解决方案在使用 sftp.putsftp.putfo

时传入 confirm=False 可以很好地消除错误

如果您希望此检查仍然像您在 post 中提到的那样 运行 以查看文件是否已完全上传,您可以 运行 按照这些行进行操作。为此,您需要知道移动的文件位置并能够读取该文件。

进口os

sftp.putfo(source_file_object, destination_file, confirm=False)
upload_size = sftp.stat(moved_path).st_size
local_size = os.stat(source_file_object).st_size
if upload_size != local_size:
    raise IOError(
        "size mismatch in put!  {} != {}".format(upload_size, local_size)
    )

两次检查都使用 os.stat