Python 3.6.3を使用しています。PythonでftpディレクトリをリストするときにOSErrorを取得する
FTP_TLS経由でftplib
を使用するようにFTPに接続しています。
ftps = ftplib.FTP_TLS('example.com', timeout=5)
# TLS is more secure than SSL
ftps.ssl_version = ssl.PROTOCOL_TLS
# login before securing control channel
ftps.login('[email protected]', 'password')
# switch to secure data connection
ftps.prot_p()
# Explicitly set Passive mode
ftps.set_pasv(True)
これはすべて動作します。私はftps.mkd('mydir')
(ディレクトリを作る)とftps.cwd('mydir')
(作業ディレクトリを変更する)を送ることができ、両方とも正常に動作します。
しかし、私は(彼らは私の知る限り、すべての基本的同義語です)これらの任意のを送信する場合:
ftps.dir()
ftps.nlst()
ftps.retrlines('LIST')
ftps.retrlines('MLSD')
それから私はまた、すべてのftplibのデバッグ情報が含まれて(下のバック例外を取得よく、FileZillaが示しているものとよく一致します):
*cmd* 'AUTH TLS'
*put* 'AUTH TLS\r\n'
*get* '234 AUTH TLS OK.\n'
*resp* '234 AUTH TLS OK.'
*cmd* 'USER [email protected]'
*put* 'USER [email protected]\r\n'
*get* '331 User [email protected] OK. Password required\n'
*resp* '331 User [email protected] OK. Password required'
*cmd* 'PASS ******************************'
*put* 'PASS ******************************\r\n'
*get* '230 OK. Current restricted directory is /\n'
*resp* '230 OK. Current restricted directory is /'
*cmd* 'PBSZ 0'
*put* 'PBSZ 0\r\n'
*get* '200 PBSZ=0\n'
*resp* '200 PBSZ=0'
*cmd* 'PROT P'
*put* 'PROT P\r\n'
*get* '200 Data protection level set to "private"\n'
*resp* '200 Data protection level set to "private"'
*cmd* 'MKD mydir'
*put* 'MKD mydir\r\n'
*get* '257 "mydir" : The directory was successfully created\n'
*resp* '257 "mydir" : The directory was successfully created'
*cmd* 'CWD mydir'
*put* 'CWD mydir\r\n'
*get* '250 OK. Current directory is /mydir\n'
*resp* '250 OK. Current directory is /mydir'
*cmd* 'TYPE A'
*put* 'TYPE A\r\n'
*get* '200 TYPE is now ASCII\n'
*resp* '200 TYPE is now ASCII'
*cmd* 'PASV'
*put* 'PASV\r\n'
*get* '227 Entering Passive Mode (8,8,8,8,8,8)\n'
*resp* '227 Entering Passive Mode (8,8,8,8,8,8)'
*cmd* 'MLSD'
*put* 'MLSD\r\n'
*get* '150 Accepted data connection\n'
*resp* '150 Accepted data connection'
Traceback (most recent call last):
File "c:\my_script.py", line 384, in run_ftps
ftps.retrlines('MLSD')
File "c:\libs\Python36\lib\ftplib.py", line 485, in retrlines
conn.unwrap()
File "C:\libs\Python36\lib\ssl.py", line 1051, in unwrap
s = self._sslobj.unwrap()
File "C:\libs\Python36\lib\ssl.py", line 698, in unwrap
return self._sslobj.shutdown()
OSError: [Errno 0] Error
同じFTPコマンド(LIST)は、filezillaでうまく動作します。
私がグーグルで見つけた最も近いことは、https://bugs.python.org/msg253161です。関連性があるか関連性があるかどうかはわかりません。
ショートバージョン:「OSError:[Errno 0] Error」は実際には何を意味し、どのように私のディレクトリの内容を一覧表示しますか?
編集:この問題は、FTP_TLSでのみ発生するようです。普通のFTP接続でうまく動作しますが、FTP_TLSが必要です。