Почему предоставление stdin для subprocess.Popen приводит к изменению того, что записано в stdout?

Я использую подпроцесс Python.Popen для выполнения некоторых FTP с использованием двоичного клиента операционной системы хоста. Я не могу использовать ftplib или любую другую библиотеку по разным причинам.

Поведение бинарного файла, похоже, изменится, если я присоединю обработчик stdin к экземпляру 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  
>>>

Commands.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'  
>>>

Первоначально я думал, что это была особенность ftp-клиента XP, возможно, зная, что он не находится в интерактивном режиме, и поэтому ограничил его вывод. Однако то же самое поведение происходит с ftp OS X - все ответы сервера отсутствуют в stdout, если указан stdin - что заставляет меня думать, что это нормальное поведение.

В Windows я могу использовать ключ -s для эффективного сценария ftp без использования stdin, но на других платформах для такого рода взаимодействия используется оболочка.

Версия Python 2.6.x на обеих платформах. Зачем указывать дескриптор stdin для изменения stdout и куда делись ответы сервера?

Ответы на вопрос(2)

Ваш ответ на вопрос