Can';t使用Python ftplib列出文件和目录

Can';t使用Python ftplib列出文件和目录,python,ftp,Python,Ftp,我使用Python中的ftplib连接到一个使用TLS显式加密的FTP服务器,我可以在路径之间切换,但无法从中检索文件和目录 from ftplib import FTP_TLS ftps = FTP_TLS('HOST') ftps.login('USER', 'PASS') ftps.prot_p() ftps.cwd('path/to/files/') print(ftps.sendcmd('PWD')) #print current path ftps.retrlines('LIST'

我使用Python中的ftplib连接到一个使用TLS显式加密的FTP服务器,我可以在路径之间切换,但无法从中检索文件和目录

from ftplib import FTP_TLS
ftps = FTP_TLS('HOST')
ftps.login('USER', 'PASS')
ftps.prot_p()
ftps.cwd('path/to/files/')
print(ftps.sendcmd('PWD')) #print current path

ftps.retrlines('LIST') #code stop here
调试时,代码在ftplib.py的retrlines函数的这一行停止:

with self.transfercmd(cmd) as conn, \
         conn.makefile('r', encoding=self.encoding) as fp:

我曾尝试使用其他函数,如ftp.nlst(),但同样的问题也发生了。

下面的解决方案适用于@mpioski,适用于Python 2.7.12和Python 3.5.2的TLS加密

from ftplib import FTP_TLS

# replace original makepasv function with one which always returns
# the peerhost of the control connections as peerhost for the data
# connection
_old_makepasv = FTP_TLS.makepasv
def _new_makepasv(self):
    host,port = _old_makepasv(self)
    host = self.sock.getpeername()[0]
    return host,port
FTP_TLS.makepasv = _new_makepasv

ftp = FTP_TLS(ipAddress)
ftp.login(...)
ftp.nlst()
以下代码适用于我,对于非TLS加密,我们将列出该位置的所有文件

from ftplib import FTP
ftp = FTP(str(ftp_hostname),str(ftp_username),str(ftp_password))
ftp.cwd(str(ftp_location))
files_list = ftp.nlst()
for filename in files_list:
    print(filename) 

我已经试过了,但我甚至无法连接,因为ftp使用TLS显式加密,所以我需要导入ftp_TLS.oh!好的,那就试试这两种方法吧,谢谢你,这种方法很管用@AnupYadav你应该给出你的答案(你可以链接到另一个问题),这样你的答案就代表了它自己。这些评论不应该永远停留。这将使您的答案更好、更完整。谢谢@Jean Françoisfar将编辑答案。