2009-03-01 37 views
9

Tôi đang tải một tập hợp lớn các tập tin với mã sau đây trong một vòng lặp:làm thế nào để time-out một cách duyên dáng khi tải với python

try: 
    urllib.urlretrieve(url2download, destination_on_local_filesystem) 
except KeyboardInterrupt: 
    break 
except: 
    print "Timed-out or got some other exception: "+url2download 

Nếu máy chủ lần-out trên URL url2download khi kết nối chỉ là bắt đầu , ngoại lệ cuối cùng được xử lý đúng cách. Nhưng đôi khi máy chủ trả lời, và tải được khởi động, nhưng máy chủ như vậy là chậm, mà nó sẽ mất giờ cho dù chỉ một tập tin, và cuối cùng nó sẽ trả về một cái gì đó như:

Enter username for Clients Only at albrightandomalley.com: 
Enter password for in Clients Only at albrightandomalley.com: 

và chỉ bị treo ở đó (mặc dù không hỏi username/passworde được hỏi nếu cùng một liên kết được tải xuống thông qua trình duyệt).

Ý định của tôi trong trường hợp này sẽ là - bỏ qua tệp này và chuyển đến tệp tiếp theo. Câu hỏi đặt ra là - làm thế nào để làm điều đó? Có cách nào trong python để xác định bao lâu là OK để làm việc trên tải về một tập tin, và nếu có thêm thời gian đã được chi tiêu, gián đoạn, và đi về phía trước?

+0

gì bạn đang nhìn thấy ở đó là máy chủ yêu cầu xác thực. Theo mặc định 'urllib.urlretrieve()' sẽ nhắc người dùng nhập tên người dùng và mật khẩu. Nếu bạn muốn tránh điều này, bạn có thể tạo một lớp mới bắt nguồn từ 'urllib.FancyURLOpener' và tự mình xử lý lỗi này. –

Trả lời

3

Có một cuộc thảo luận về điều này here. Hãy cẩn thận (ngoài những gì họ đề cập): Tôi chưa thử nó, và họ đang sử dụng urllib2, không phải urllib (đó có phải là vấn đề với bạn không?) (Thực ra, bây giờ tôi nghĩ về nó, kỹ thuật này sẽ có thể làm việc cho urllib, quá).

4

Nếu bạn không giới hạn ở những gì đang vận chuyển với python ra khỏi hộp, sau đó các module urlgrabber có thể có ích:

import urlgrabber 
urlgrabber.urlgrab(url2download, destination_on_local_filesystem, 
        timeout=30.0) 
+0

liên kết urlgrabber không còn tồn tại. –

2

Câu hỏi này là tổng quát hơn về thời gian ra một chức năng: How to limit execution time of a function call in Python

Tôi đã sử dụng phương pháp được mô tả trong câu trả lời của tôi ở đó để viết một chức năng chờ đợi cho văn bản mà lần ra để cố gắng đăng nhập tự động. Nếu bạn muốn chức năng tương tự bạn có thể tham khảo đoạn code ở đây:

http://code.google.com/p/psftplib/source/browse/trunk/psftplib.py

8

Hãy thử:

import socket

socket.setdefaulttimeout(30)

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