2013-06-18 12 views
5

Tôi đang tìm cách tải xuống tệp nhanh chóng qua HTTP, sử dụng một lớp lót con trăn từ dòng lệnh (tương tự như chức năng của wget hoặc curl). Ý tưởng là cho phép sao chép/dán nhanh để tải xuống distutils trên Windows.Tải xuống tệp từ dòng lệnh bằng cách sử dụng python

Tôi biết một giải pháp (xem câu trả lời của tôi bên dưới). Tôi quan tâm đến các giải pháp khác mà xem xét như sau:

  • ngắn gọn
  • Hầu hết các "pythonic" giải pháp
  • Tương thích với cả python2 và python3
  • Cross-nền tảng
  • có thể đối phó với các tập tin lớn hiệu quả
  • Không phụ thuộc (chúng tôi đang tìm nạp distutils tại đây, có khả năng chúng tôi sẽ không truy cập được requests ở giai đoạn này)
  • đúng xử lý tiêu đề HTTP khác nhau như Content-Disposition
+1

Distutils và setuptools đã hợp nhất. Để thực hiện mục tiêu ban đầu của tôi: 'c: \ python27 \ python.exe -c" từ url nhập urllib, urlretrieve ('https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py', 'ez_setup. py ') "& c: \ python27 \ python.exe ez_setup.py' – dwurf

Trả lời

4

Giải pháp đơn giản nhất tôi có thể đưa ra sẽ là:

try: 
    from urllib.request import urlretrieve 
except ImportError: 
    from urllib import urlretrieve 

urlretrieve('http://example.org', 'outfile.dat') 

urlretrieve sẽ chăm sóc của tải tài nguyên vào một tệp cục bộ và có thể xử lý các tệp lớn. Tuy nhiên,

Tuy nhiên, bỏ qua các tiêu đề Content-Disposition, nếu muốn xem xét, bạn cần tự mình sử dụng urlopen và phân tích cú pháp tiêu đề phản hồi. Content-Disposition không phải là tiêu đề HTTP tiêu chuẩn, vì vậy tôi nghi ngờ bạn sẽ tìm thấy nhiều hỗ trợ cho nó trong thư viện http python ...

+0

Điều chính này không có khả năng chạy nó thông qua một lớp lót CLI. Tôi sẽ đánh dấu điều này là chính xác vì nó có thể được chia thành hai câu lệnh, một cho python2 và một cho python3, có thể xử lý các tệp lớn và chạy dưới dạng một lớp lót. – dwurf

+4

Python 2: 'python -c" từ url nhập url urllib; urlretrieve ('http://python-distribute.org/distribute_setup.py', 'distribution_setup.py') "' – dwurf

+0

Python 3: 'python3 -c" từ urretib.request import urlretrieve; urlretrieve ('http://python-distribute.org/distribute_setup.py', 'distribution_setup.py') "' – dwurf

5

giải pháp của tôi là:

python -c "import urllib; print urllib.urlopen('http://python-distribute.org/distribute_setup.py').read()" > distribute_setup.py 
+0

điều này thực sự xấu cho các tệp lớn và nó chỉ hoạt động trên python2. không thực sự những gì OP muốn. – mata