Tôi đang sử dụng tiến trình con của Python.Popen để thực hiện một số FTP bằng cách sử dụng ứng dụng nhị phân của hệ điều hành máy chủ. Tôi không thể sử dụng ftplib hoặc bất kỳ thư viện nào khác vì nhiều lý do.Tại sao cung cấp stdin để subprocess.Popen gây ra những gì được viết để stdout để thay đổi?
Hành vi của nhị phân dường như thay đổi nếu tôi đính kèm trình xử lý stdin vào đối tượng Popen. Ví dụ, sử dụng FTP client XP, mà chấp nhận một tập tin văn bản của lệnh đối với vấ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
Khi còn cung cấp thiết bị nhập chuẩn, tất cả các bạn nhận được trong stdout là:
>>>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'
>>>
Ban đầu, tôi nghĩ đây là một điều không minh bạch của khách hàng XPpp, có lẽ biết nó không ở chế độ tương tác và do đó hạn chế đầu ra của nó. Tuy nhiên, cùng một hành vi xảy ra với ftp của OS X - tất cả các phản hồi của máy chủ bị thiếu từ stdout nếu stdin được cung cấp - điều này dẫn tôi đến đây nghĩ rằng đây là hành vi bình thường.
Trong Windows, tôi có thể sử dụng nút chuyển-s để tập lệnh có hiệu quả ftp mà không sử dụng stdin, nhưng trên nền tảng khác dựa trên vỏ cho loại tương tác đó.
Phiên bản Python là 2.6.x trên cả hai nền tảng. Tại sao sẽ cung cấp một xử lý cho stdout stdin thay đổi, và nơi có phản ứng máy chủ đi đến?
Bạn đã cân nhắc sử dụng 'ftplib' chưa? http://docs.python.org/library/ftplib.html –
lý do bạn không thể sử dụng ftplib là gì. nó đi kèm với phân phối Python của bạn phải không? – ghostdog74