2016-10-12 3 views
0

Я портировал набор сценариев Python 2.7 на Python 3.5, чтобы я мог использовать некоторые библиотеки, которые недоступны в версии 2.7, но я получаю MemoryError из этого кода который работал ранее:Hashlib MemoryError в Python 3.5, но не в 2.7

import hashlib, functools 
sha2h = hashlib.sha256() 
with open('/path/to/any/file', 'rb') as f: 
     [sha2h.update(chunk) for chunk in iter(functools.partial(f.read, 256), '')] 

насколько я могу сказать, что это правильный способ, чтобы получить SHA256 хэш файла. Кажется, я ничего не могу найти по этому поводу. Если это помогает, вот отслеживающий, когда приведенный выше код запускается из командной строки:

File "<stdin>", line 2, in <module> 
File "<stdin>", line 2, in <listcomp> 

попытался также заменить

sha2h = hashlib.sha256() 

с

sha2h = hashlib.new('sha256') 

в соответствии с документацией для hashlib, но это не привело к изменению результатов.

Любая помощь или понимание были бы оценены с благодарностью!

ответ

0

На Python 3, вам необходимо установить b'' вместо '' в качестве значения дозорного для iter вызова:

iter(functools.partial(f.read, 256), b'') 

Вы также действительно не должны использовать список понимание для побочных эффектов, как это, но если вы портируете существующий код, который делает это, вероятно, лучше просто оставить это на данный момент.

+0

Спасибо! Это изменение изменило мою проблему. – Nstr10

+0

Смущающе, это код, который я изначально написал - мой чрезмерно амбициозный проект «Hello world». Если вы чувствуете дополнительную полезность для этого новичка Python, не могли бы вы предложить (или ссылку) более правильный способ сделать это? – Nstr10

+0

@ Nstr10: Используйте обычный цикл 'for'. – user2357112