ホスト オペレーティング システムのバイナリ クライアントを使用して FTP を実行するために、Python の subprocess.Popen を使用しています。さまざまな理由で、ftplib やその他のライブラリを使用できません。
stdin ハンドラを Popen インスタンスにアタッチすると、バイナリの動作が変わるようです。たとえば、発行するコマンドのテキスト ファイルを受け入れる XP の ftp クライアントを使用すると、次のようになります。
>>>from subprocess import Popen, PIPE
>>>p = Popen(['ftp','-A','-s:commands.txt','example.com'], stdout=PIPE)
>>>p.communicate()[0]
'Connected to example.com.
220 ProFTPD 1.3.1 Server (Debian) ...
331 Anonymous login ok, send your complete email address as your password
<snip>
ftp> binary
200 Type set to I
ftp> get /testfiles/100.KiB
200 PORT command successful
150 Opening BINARY mode data connection for /testfiles/100.KiB (102400 bytes)
226 Transfer complete
ftp: 102400 bytes received in 0.28Seconds 365.71Kbytes/sec.
ftp> quit
>>>
コマンド.txt:
binary
get /testfiles/100.KiB
quit
stdin も提供する場合、stdout で得られるのは次のとおりです。
>>>from subprocess import Popen, PIPE
>>>p = Popen(['ftp','-A','-s:commands.txt','example.com'], stdin=PIPE, stdout=PIPE)
>>>p.communicate()[0]
'binary
get /testfiles/100.KiB
quit'
>>>
最初は、これは XP ftp クライアントの癖だと思っていました。おそらく、対話モードではないことを知っていたため、出力が制限されていたのでしょう。ただし、OS X の ftp でも同じ動作が発生します。stdin が指定されている場合、すべてのサーバー応答が stdout から欠落しています。これは、これが正常な動作であると私に思わせます。
Windows では -s スイッチを使用して、stdin を使用せずに ftp を効果的にスクリプト化できますが、他のプラットフォームでは、その種の対話をシェルに依存しています。
Python のバージョンは、両方のプラットフォームで 2.6.x です。stdin のハンドルを指定すると stdout が変更されるのはなぜですか? また、サーバーの応答はどこに送信されますか?