Estoy usando el subproceso de Python. Tengo permiso para realizar algunos FTP utilizando el cliente binario del sistema operativo host. No puedo usar ftplib o cualquier otra biblioteca por varias razones.¿Por qué el suministro de stdin al subproceso.Popen hace que cambie lo que está escrito en stdout?
El comportamiento del binario parece cambiar si adjunto un controlador stdin a la instancia de Popen. Por ejemplo, usando el cliente FTP de XP, que acepta un archivo de texto de los comandos de edición:
>>>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
Cuando también el suministro de la entrada estándar, todo lo que obtiene en la salida estándar es:
>>>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'
>>>
Inicialmente pensé que esto era un capricho del cliente de ftp XP, quizás sabiendo que no estaba en modo interactivo y, por lo tanto, limitando su salida. Sin embargo, el mismo comportamiento ocurre con el ftp de OS X. Todas las respuestas del servidor faltan en stdout si se proporciona stdin, lo que me lleva a pensar que esto es un comportamiento normal.
En Windows puedo usar el modificador -s para guiar eficazmente ftp sin usar stdin, pero en otras plataformas uno se basa en el shell para ese tipo de interacción.
La versión de Python es 2.6.x en ambas plataformas. ¿Por qué el suministro de un controlador para stdin cambiar stdout, y donde han ido las respuestas del servidor?
¿Ha considerado usar 'ftplib'? http://docs.python.org/library/ftplib.html –
cuáles son las razones por las que no puedes usar ftplib. viene con tu distribución Python ¿verdad? – ghostdog74