2010-08-10 33 views
8

Tôi đang cố gắng sử dụng ftplib để lấy danh sách tệp và tải xuống bất kỳ tệp mới nào kể từ lần kiểm tra cuối cùng của tôi. Mã tôi đang cố gắng chạy cho đến thời điểm này là:Python ftplib time out

#!/usr/bin/env python 
from ftplib import FTP 
import sys 

host = 'ftp.***.com' 
user = '***' 
passwd = '***' 

try: 
    ftp = FTP(host) 
    ftp.login(user, passwd) 
except: 
    print 'Error connecting to FTP server' 
    sys.exit() 

try: 
    ftp.retrlines('LIST') 
except: 
    print 'Error fetching file listing' 
    ftp.quit() 
    sys.exit() 

ftp.quit() 

Bất cứ khi nào tôi chạy mã này lần khi tôi cố truy xuất danh sách. Bất kỳ ý tưởng?

Trả lời

9

Rất có thể là xung đột giữa chế độ Hoạt động và Bị động. Hãy chắc chắn rằng một trong những điều sau đây là đúng:

  1. Máy chủ hỗ trợ chế độ PASV và khách hàng của bạn là thiết lập chế độ PASV
  2. Nếu máy chủ không hỗ trợ chế độ thụ động, sau đó tường lửa của bạn phải hỗ trợ chuyển chế độ FTP hoạt động.

EDIT: Tôi đã xem tài liệu và thấy rằng trong Python 2.1 trở lên mặc định là chế độ thụ động. Bạn đang nói chuyện với máy chủ gì và bạn biết liệu nó có hỗ trợ chế độ thụ động không?

Ở chế độ hoạt động (không phải PASV), máy khách gửi lệnh PORT yêu cầu máy chủ khởi tạo kết nối DATA trên cổng đó, yêu cầu tường lửa của bạn phải biết lệnh PORT để có thể chuyển tiếp kết nối DATA đến cho bạn - vài bức tường lửa hỗ trợ điều này. Trong chế độ thụ động, máy khách sẽ mở kết nối DATA và máy chủ sử dụng nó (máy chủ bị "thụ động" khi mở kết nối dữ liệu).

Chỉ trong trường hợp bạn không sử dụng chế độ thụ động, hãy thực hiện ftp.set_pasv(True) và xem điều đó có tạo sự khác biệt hay không.

+1

Bạn nói đúng là đã xảy ra sự cố với chế độ này. Máy chủ tôi đang cố gắng nói chuyện với hoạt động bắt buộc. Cảm ơn đã giúp đỡ! – blcArmadillo

10

Nếu Passive Mode là không vì một lý do try:

ftp.set_pasv(False) 

sử dụng chế độ Active mode.

Các vấn đề liên quan