我正在使用pysftp上传本地文件,该文件将进行远程处理,然后返回到SFTP,从中可以下载它。目前,我无法获得识别已上传处理过的远程文件的代码。尽管成功处理了远程处理的文件,但代码只是永远等待。
代码正在运行时,如果我刷新诸如FileZilla之类的服务上的连接,则代码会立即识别出文件已插入并且运行正常。但是,我需要它在不手动刷新FileZilla的情况下工作。我不确定为什么代码无法识别出文件已经上传并且可以下载了。
我已经尝试使用while语句断开连接,然后重新连接到SFTP,但操作不成功。
import pysftp
import stat
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
srv = pysftp.Connection(host="host", username="username", password="passowrd", cnopts=cnopts)
print("Connection Made!")
# Put File In
srv.chdir(r'/path_to_remote_directory')
srv.put(r'C:\Path_to_local_file.csv')
print("File Uploaded")
while not srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
time.sleep(3)
print("Still Waiting")
if srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
print("File is Ready!")
srv.get('/Path_to_newly_uploaded_remote_file.csv', r'C:\Local_path_save_to/file.csv')
# Closes the connection
srv.close()
答案 0 :(得分:1)
只需删除/
:
srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
->
srv.isfile(r'Path_to_newly_uploaded_remote_file.csv'):
注意:
不要设置cnopts.hostkeys = None, 除非您不在乎安全性。您失去了防范 这样做是对中间人的攻击。</ p>
我在pysftp github fork中实现了auto_add_key
。
auto_add_key
将把密钥添加到known_hosts
,如果auto_add_key=True
在known_hosts
中为主机提供密钥后,将对其进行检查。
有关安全性问题,请参阅Martin Prikryl-> answer。
Why using context manager is a good approach:
import pysftp
with pysftp.Connection(host, username="whatever", password="whatever", auto_add_key=True) as sftp:
#do your stuff here
#connection closed
编辑:
请检查我的代码并/
是问题所在……请检查文件的拼写,并且您位于正确的工作目录getcwd()
_
import pysftp
import stat
import time
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None #do not do this !!!
srv = pysftp.Connection("host", username="user", password="pass", cnopts=cnopts)
print("Connection Made!")
# Put File In
srv.chdir(r'/upload')
srv.put(r'C:\Users\Fabian\Desktop\SFTP\testcsv.csv')
print("File Uploaded")
print(srv.getcwd()) #get the current folder ! <- you should looking here
while not srv.isfile(r'testcsv.csv'):
time.sleep(3)
print("Still Waiting")
if srv.isfile(r'testcsv.csv'):
print("File is Ready!")
srv.get('testcsv.csv', r'C:\Users\Fabian\Desktop\SFTP\testcsv_new.csv')
# Closes the connection
srv.close()
答案 1 :(得分:0)
找到了可行的解决方案。我认为这是由于旧目录被缓存导致的。通过每次都指向新目录进行更新,它似乎可以工作。现在的解决方案很明显,但花了我一段时间。发布,以防其他人碰到这个。
while not srv.isfile(r'/Path_to_newly_uploaded_remote_file.csv'):
time.sleep(3)
srv.chdir(r'/Path_to_newly_uploaded_remote_file')
print("Still Waiting")