如果 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.put
的 confirm
参数设置为 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.put
或 sftp.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
我正在调用 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.put
的 confirm
参数设置为 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.put
或 sftp.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