2013-06-18 9 views
5

Sto cercando un modo rapido per scaricare un file tramite HTTP, utilizzando un one-liner python dalla riga di comando (simile alla funzionalità di wget o curl). L'idea è di abilitare una copia/incolla veloce per scaricare distutils su Windows.Download di un file dalla riga di comando utilizzando python

Conosco una soluzione (vedere la mia risposta di seguito). Sono interessato a altre soluzioni che considerano il seguente:

  • Concise
  • La soluzione più "divinatorio"
  • Compatibile sia con python2 e python3
  • multipiattaforma
  • può fare con file di grandi dimensioni efficientemente
  • Nessuna dipendenza (stiamo recuperando distutils qui, è improbabile che avremo accesso a requests in questa fase)
  • gestisce correttamente varie intestazioni HTTP, come Content-Disposition
+1

Distutils e setuptools si sono uniti. Per raggiungere il mio obiettivo originale: 'c: \ python27 \ python.exe -c" da 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

risposta

4

La soluzione più semplice che potrei venire con sarebbe:

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

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

urlretrieve si occupa di scaricare la risorsa in un file locale e può gestire file di grandi dimensioni.

Tuttavia ignora le intestazioni Content-Disposition, se si desidera che ciò sia considerato, è necessario utilizzare urlopen e analizzare le intestazioni di risposta da soli. Content-Disposition non è un'intestazione standard HTTP, quindi dubito che troverai molto supporto nelle librerie http python ...

+0

La cosa principale che non ha è la possibilità di eseguirlo tramite una sola linea CLI. Lo contrassegnerò come corretto poiché può essere diviso in due istruzioni, una per python2 e una per python3, in grado di gestire file di grandi dimensioni e di essere eseguita come one-liner. – dwurf

+4

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

+0

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

5

La mia soluzione è:

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

questo è davvero pessimo per i file di grandi dimensioni, e funziona solo su python2. non proprio quello che l'OP voleva. – mata