2013-06-18 2 views
5

Я ищу быстрый способ загрузить файл через HTTP, используя однострочный интерфейс python из командной строки (аналогично функциональности wget или curl). Идея заключается в том, чтобы быстро загрузить/вставить для загрузки distutils в Windows.Загрузка файла из командной строки с использованием python

Я знаю одно решение (см. Мой ответ ниже). Я заинтересован в других решений, которые учитывают следующее:

  • Сжатый
  • Большинство «вещий» решение
  • Совместим с python2 и Python3
  • кросс-платформенной
  • Может работать с большими файлами эффективно
  • Никаких зависимостей (мы получаем distutils здесь, маловероятно, что у нас будет доступ к requests на этом этапе)
  • Правильно обрабатывает различные HTTP-заголовки, такие как Content-Disposition
+1

Distutils и setuptools объединены. Чтобы выполнить мою первоначальную цель: 'c: \ python27 \ python.exe -c" из 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

ответ

4

Самое простое решение, которое я мог придумать было бы:

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

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

urlretrieve заботится о загрузке ресурс в локальный файл и может обрабатывать большие файлы.

Он, однако, игнорирует заголовки Content-Disposition, если вы хотите, чтобы это учитывалось, вам нужно будет использовать urlopen и самостоятельно проанализировать заголовки ответов. Content-Disposition не является стандартным заголовком HTTP, поэтому я сомневаюсь, что вы найдете много поддержки для него в http-библиотеках python ...

+0

Главное, что у этого нет, это возможность запускать его с помощью однострочного интерфейса CLI. Я буду отмечать это как правильно, так как его можно разделить на два оператора: один для python2 и один для python3, который может обрабатывать большие файлы и запускаться как однострочный. – dwurf

+4

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

+0

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

5

Мое решение:

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

Это действительно плохо для больших файлов, и оно работает только на python2. не совсем то, что хотел OP. – mata

Смежные вопросы