Python ftp存储冻结

Python ftp存储冻结,python,ftp,ftplib,Python,Ftp,Ftplib,我在python脚本中遇到一些问题,无法通过TLS将一些文件上载到ftp。我使用以下代码: ftps = FTP_TLS(FTP_SERVER) ftps.set_debuglevel(2) ftps.login(FTP_USER,FTP_PASSWORD) ftps.prot_p() ftps.cwd(DIR) ftps.storlines("STOR " + filename, open(file)) 在这一点上,脚本似乎冻结了。例如,如果我通过filezilla登录ftp服务器,我可以看

我在python脚本中遇到一些问题,无法通过TLS将一些文件上载到ftp。我使用以下代码:

ftps = FTP_TLS(FTP_SERVER)
ftps.set_debuglevel(2)
ftps.login(FTP_USER,FTP_PASSWORD)
ftps.prot_p()
ftps.cwd(DIR)
ftps.storlines("STOR " + filename, open(file))
在这一点上,脚本似乎冻结了。例如,如果我通过filezilla登录ftp服务器,我可以看到创建的文件,但大小是0Kb。我想用Ctrl+C取消脚本,然后文件在filezilla中显示为正确的大小。如果我让脚本完成,文件将在ftp服务器上删除

调试输出如下所示:

*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH command ok. Expecting TLS Negotiation.\r\n'
*resp* '234 AUTH command ok. Expecting TLS Negotiation.'
*cmd* 'USER XXXXXXXXX'
*put* 'USER XXXXXXXXX\r\n'
*get* '331 Password required\r\n'
*resp* '331 Password required'
*cmd* 'PASS **************'
*put* 'PASS **************\r\n'
*get* '230-congrats\r\n'
*get* '230 User logged in.\r\n'
*resp* '230-congrats\n230 User logged in.'
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 PBSZ command successful.\r\n'
*resp* '200 PBSZ command successful.'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 PROT command successful.\r\n'
*resp* '200 PROT command successful.'
*cmd* 'CWD XXXXXXXXX'
*put* 'CWD XXXXXXXXX\r\n'
*get* '250 CWD command successful.\r\n'
*resp* '250 CWD command successful.'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 Type set to A.\r\n'
*resp* '200 Type set to A.'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (XXXXXXXXXXXXXX).\r\n'
*resp* '227 Entering Passive Mode (XXXXXXXXXXXX).'
*cmd* 'STOR file.txt'
*put* 'STOR file.txt\r\n'
*get* '125 Data connection already open; Transfer starting.\r\n'
*resp* '125 Data connection already open; Transfer starting.'
^C
*cmd* 'QUIT'
*put* 'QUIT\r\n'
*get* '226 Transfer complete.\r\n'
*resp* '226 Transfer complete.'
此时脚本将冻结:

*resp* '125 Data connection already open; Transfer starting.'

有什么问题吗?

我可以设置一个TLS服务器,并使用与python 2.7完全相同的命令

一切顺利。我得到的答案略有不同,因为我想我并没有像你们一样使用同一台服务器。在
storelines
命令中,情况开始大不相同(我使用
with
来确保文件将被关闭):

主要区别在于,当您获得一个
125数据连接时,我获得了一个
150打开的ASCII模式SSL数据连接
;传输启动。

我的结论是,您的客户端脚本不是原因,因为它在我的计算机上工作,而是服务器FTPD或两者之间的网络问题(代理?)。但是我不喜欢
125数据连接已经打开

编辑:

我在Python 3.4下的工作原理相同,但需要以二进制模式打开本地文件:

with open(filename, 'rb') as fd:
    ftps.storlines("STOR foo.txt", fd)

相同的输出…

可能是被动配置的问题吗?也许您可以尝试在调用
storlines
之前使用
ftps.set_pasv(False)
进行配置,如果我将pasv设置为False,则会出现以下错误:ftplib.error\u perm:501服务器无法接受参数。为了确保输入文件没有问题,您可以尝试:
import io txtfile=io.StringIO(u“abc\ndefgh\nijkl\n”)
然后
ftps.storlines(“STOR”+文件名,txtfile)
相同的结果挂起在这里:*get*'125数据连接已打开;传输开始。\r\n“resp”125数据连接已打开;传输开始。您是否控制FTP服务器及其网络?这是什么服务器?谢谢,我不能控制服务器端,但我可以和他们交谈,他们改变了一些东西,现在它工作了。他们使用iis7。
with open(filename, 'rb') as fd:
    ftps.storlines("STOR foo.txt", fd)