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