我花了数小时来解决这个问题,在网上搜寻,但总体上没有运气。设置如下:
最初,我写了一些Pysftp(Paramiko)代码:
import pysftp
with pysftp.Connection(host=host, username=username,
password=password, cnopts=sftp_options) as sftp:
sftp.put(localpath, remotepath, confirm=True)
在测试时适用于较小的文件。它也成功运行了一个大文件,但是回头看该文件夹时找不到文件。我毫无根据的预感是,它花了太长时间,帕拉米科不知不觉地将这些碎屑打成一片空白。
我转而使用sftp
命令行实用程序,该实用程序可在Windows 10上方便地使用。我能够手动测试上传的工作方式如下:
sftp username@host
Welcome to this funky Secure FTP Server. Please enter your password:
sftp> PUT localpath remotepath
sftp> QUIT
显然,关键问题是 password 输入,我弯下腰试图用Popen()
使之自动化。我在StackOverflow上阅读并仔细研究了这些内容:Use subprocess to send a password和Python: How to read stdout of subprocess in a nonblocking way。这场比赛没有任何结果。
我能够读取输出,但输入似乎总是来自键盘 。然后,我尝试了Pexpect
,由于在Windows it operates differently上也无法使用,因此在某些程序上也无法使用:
PopenSpawn不能直接替代spawn。许多程序只有在检测到它们正在终端中运行时,才提供交互行为。当由PopenSpawn运行时,它们的行为可能会有所不同。
psftp.exe
,该命令行接受password作为参数。我还确认,带有大文件的Pysftp / Paramiko在我自己设置的SFTP服务器上可以正常工作,因此与供应商的服务器有关(我无能为力)。我将继续解决这个问题,并希望在此处发布完整的答案。除了求助于Ubuntu via WSL之外,还有谁对如何在Windows上使用Python 3.x将文件上传到SFTP服务器上有任何想法?