2011-07-11 4 views
2

Une instruction if en Python est évaluée et elle renvoie la valeur non attendue.Si la déclaration retourne la mauvaise valeur?

p = sub.Popen('md5.exe -n md5.exe',stdout=sub.PIPE,stderr=sub.PIPE) 
md5, errors = p.communicate() 
print md5 
abc = "8D443F2E93A3F0B67F442E4F1D5A4D6D" 
print abc 
if md5 == abc: print 'TRUE' 
else: print 'FALSE' 

repr(md5) est '8D443F2E93A3F0B67F442E4F1D5A4D6D\r\n'.

Les 2 chaînes sont les mêmes, mais elle évalue et imprime FALSE.

Que se passe-t-il ici, et comment cela peut-il être résolu?

+3

Veuillez 'imprimer repr (md5)' et 'imprimer repr (abc)', puis ** mettre à jour ** la question avec la sortie de chaque impression. –

+0

Essayez d'imprimer 'repr (md5)' sur la ligne 3. Etes-vous sûr qu'ils sont identiques? – nmichaels

+0

Pouvez-vous faire: Je suppose qu'il y a un saut de ligne quelque part ou quelque chose dans ce sens. essayez: 'md5.strip() == abc'instead. Sinon, exécutez 'print repr (md5)' et renvoyez – phant0m

Répondre

9

Votre md5 contient des espaces de fin, ce que la valeur abc ne possède pas. La plupart des programmes de ligne de commande se terminent par un saut de ligne car cela peut perturber les utilisateurs de shell. Il est possible de sortir ceci au flux standard error afin de ne pas interférer avec des programmes comme le vôtre, mais cela n'est souvent pas fait.

Vous pouvez utiliser la méthode de chaîne .strip() pour supprimer tous les espaces du début et de la fin d'une chaîne. Par exemple,

md5 = md5.strip() 

Si vous utilisez Python 3, la même erreur aurait pu être dû au fait que la méthode de l'objet Subprocess.communicate() retourne des objets bytes, qui ne sont pas être égal à toutes les chaînes.

+0

Ce ne sont pas des espaces. C'est un saut de ligne Windows. – phant0m

+0

@ phant0m: Le saut de ligne de Windows est composé de deux caractères, généralement résumés comme des "espaces". –

+0

@ S.Lott j'ai utilisé à l'origine juste dit "espaces". J'ai édité le post en réponse à son commentaire. –