Я использую подпроцесс Python.Popen для выполнения некоторого FTP с использованием двоичного клиента операционной системы хоста. Я не могу использовать ftplib или любую другую библиотеку по разным причинам.
Поведение двоичного файла, похоже, изменится, если я присоединю обработчик стандартного ввода к экземпляру Popen. Например, используя ftp-клиент XP, который принимает текстовый файл с командами для выполнения:
>>>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
Когда вы также предоставляете стандартный ввод, все, что вы получаете в стандартном выводе, это:
>>>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'
>>>
Первоначально я думал, что это особенность ftp-клиента XP, возможно, зная, что он не находится в интерактивном режиме, и, следовательно, ограничивая его вывод. Однако то же самое происходит с ftp OS X - все ответы сервера отсутствуют в стандартном выводе, если предоставлен стандартный ввод - что заставляет меня думать, что это нормальное поведение.
В Windows я могу использовать ключ -s для эффективного сценария ftp без использования стандартного ввода, но на других платформах для такого взаимодействия полагается оболочка.
Версия Python 2.6.x на обеих платформах. Почему предоставление дескриптора для стандартного ввода изменило стандартный вывод и куда ушли ответы сервера?
ftplib
? docs.python.org/library/ftplib.html - person Ignacio Vazquez-Abrams   schedule 01.03.2010