У меня есть следующие общие настройки для поддержки Python 2 и 3 для загрузки двоичной полезной нагрузки ~ 8 МБ:
import six
if six.PY3:
from urllib.request import Request, urlopen
else:
from urllib2 import Request, urlopen
def request(url, method='GET'):
r = Request(url)
r.get_method = lambda: method
response = urlopen(r)
return response
def download_payload():
with open('output.bin', 'w') as f:
f.write(request(URL).read())
У меня есть следующие ограничения:
- Должно работатьна Python 2 и 3
- У него не должно быть практически никаких зависимостей, поскольку он будет работать как модуль Ansible в различных дистрибутивах, Ubuntu, RHEL, Fedora, Debian и т. д.
Я бы хотел минимизировать использование памяти здесь, но я не вижу документации о том, как urllib
работает внутри;всегда ли он читает ответ в память, или я могу выполнить ручную буферизацию на моем конце, чтобы сохранить использование памяти фиксированным при размере буфера?
Я думал о том, чтобы сделать что-то вроде этого:
def download_payload():
with open('output.bin', 'w') as f:
r = request(URL)
hunk = r.read(8192)
while len(hunk) > 0:
f.write(hunk)
hunk = r.read(8192)
Вопрос, с которым я сталкиваюсь, заключается в том, позволяет ли urllib
буферизовать чтение таким образом, чтобы вручную управлять памятью.Есть ли на это гарантии?Я не могу найти упоминания об использовании памяти или буферизации в документах.