2013-06-18 18 views
5

Poszukuję szybkiego sposobu pobrania pliku za pośrednictwem protokołu HTTP, używając jednego wiersza python z wiersza poleceń (podobnego do funkcji wget lub curl). Pomysł polega na umożliwieniu szybkiego kopiowania/wklejania w celu pobrania distutils w systemie Windows.Pobieranie pliku z wiersza poleceń przy użyciu pythona

Znam jedno rozwiązanie (zobacz moją odpowiedź poniżej). Jestem zainteresowany innymi rozwiązaniami, które należy rozważyć następujące kwestie:

  • Zwięzłe
  • Większość rozwiązanie „pythonic”
  • Kompatybilny zarówno python2 i python3
  • wieloplatformowy
  • Potrafi radzić sobie z dużymi plikami wydajnie
  • Brak zależności (pobieramy distutils tutaj, jest mało prawdopodobne, że będziemy mieli dostęp do requests na tym etapie)
  • poprawnie obsługuje różne nagłówki HTTP, takich jak Content-Disposition
+1

Połączyły się narzędzia Distutils i setuptools. Aby spełnić mój pierwotny cel: 'c: \ python27 \ python.exe -c" z urllib import urlretrieve; urlretrieve ('https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py', 'ez_setup. py ') "& c: \ python27 \ python.exe ez_setup.py' – dwurf

Odpowiedz

4

Najprostszym rozwiązaniem mogłem wymyślić byłoby:

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

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

urlretrieve dba o pobieraniu zasób do lokalnego pliku i może obsługiwać duże pliki.

Ignoruje jednak nagłówki Content-Disposition, jeśli chcesz, aby to było brane pod uwagę, musisz użyć urlopen i samemu przeanalizować nagłówki odpowiedzi. Content-Disposition nie jest standardowym nagłówkiem HTTP, więc wątpię, czy znajdziecie w nim wiele wsparcia w bibliotekach http w pythonie ...

+0

Najważniejszą rzeczą, której nie ma, jest możliwość uruchomienia go za pomocą jednego liniowca CLI. Zaznaczę to jako poprawne, ponieważ może być podzielone na dwie instrukcje, jedną dla python2 i jedną dla python3, która może obsługiwać duże pliki i działać jako jeden-liniowy. – dwurf

+4

Python 2: 'python -c" z urllib import urlretrieve; urlretrieve ('http://python-distribute.org/distribute_setup.py', 'distribute_setup.py') "' – dwurf

+0

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

5

Moje rozwiązanie to:

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

to jest bardzo złe dla dużych plików i działa tylko na python2. nie do końca tego, co chciał OP. – mata

Powiązane problemy