2016-10-12 1 views
0

J'ai porté un ensemble de scripts Python 2.7 vers Python 3.5 afin que je puisse utiliser des bibliothèques qui ne sont pas disponibles en 2.7, mais je reçois MemoryError à partir de ce code qui a travaillé auparavant:Hashlib MemoryError en Python 3.5 mais pas en 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), '')] 

pour autant que je peux dire, cela est la bonne façon d'obtenir un hachage SHA256 d'un fichier. Je n'arrive pas à trouver quelque chose à propos de ce problème. Si elle aide, voici le retraçage lorsque le code ci-dessus est exécuté à partir du shell:

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

également essayé de remplacer

sha2h = hashlib.sha256() 

avec

sha2h = hashlib.new('sha256') 

pour correspondre à la documentation hashlib, mais cela n'a donné aucun résultat.

Toute aide ou compréhension serait grandement appréciée!

Répondre

0

sur Python 3, vous devez définir b'' au lieu de '' comme valeur sentinelle pour le iter appel:

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

Vous aussi vraiment ne devrait pas utiliser une compréhension de la liste des effets secondaires comme celui-ci, mais Si vous portez du code existant, il est probablement préférable de laisser cela pour l'instant.

+0

Merci! Ce changement a résolu mon problème. – Nstr10

+0

Embarrassant, c'est le code que j'ai écrit à l'origine - mon projet "Hello world" trop ambitieux. Si vous vous sentez très utile pour ce débutant Python, pourriez-vous suggérer (ou lier) une façon plus appropriée de le faire? – Nstr10

+0

@ Nstr10: utilise une boucle 'for' normale. – user2357112