Forum Programmation.python Comparaison de variables avec python

Posté par  .
Étiquettes : aucune
0
6
sept.
2006
bonjour,
je cherche simplement à comparer deux variables pour vérifier qu'un login existe sur le système ou pas.

j'ai pensé que ceci fonctionnait:

login=form1.lineEdit1_1.text()
opfil=open('/etc/passwd','r')
lines = opfil.readlines()
for i in lines:
valdon=i.split(':')[0]
print str(valdon),str(login)
if str(login) == str(valdon):
print "Cet identifiant existe !"
opfil.close()


Mais, si les retours des prints sont corrects, quel que soit le login fourni, il ne m'est jamais dit qu'il existe (alors que je sais parfaitement que oui).
Pourtant, la comparaison a l'air correcte... Où est l'erreur ?
  • # Chez moi ça marche...

    Posté par  (site web personnel) . Évalué à 2.

    Ce code fonctionne. Je prend juste 'login' en argument du script, et je vire le print des couples :
    #! /usr/bin/python
    
    import sys
    
    login=sys.argv[1]
    opfil=open('/etc/passwd','r')
    lines = opfil.readlines()
    for i in lines:
        valdon=i.split(':')[0]
        if str(login) == str(valdon):
            print "Cet identifiant existe !"
    opfil.close()
    
    Résultat :
    $ ./login.py prout
    $ ./login.py root
    Cet identifiant existe !
    
    Après, tu peux faire la boucle plus propre :
    for i in file('/etc/passwd','r'):
        valdon=i.split(':')[0]
        if str(login) == valdon:
            print "Cet identifiant existe !"
    
    Plus besoin de close() parce que le fichier sera fermé automatiquement. Pas nécessaire de forcer 'valdon' en str(), c'est déjà une string (je l'ai laissé pour 'login', vu que je ne sais pas ce que form1.lineEdit1_1.text() te renvoie).
    • [^] # Re: Chez moi ça marche...

      Posté par  (site web personnel) . Évalué à 2.

      for i in file('/etc/passwd','r'):
          if str(login) == i.split(':')[0]:
              print "Cet identifiant existe !"
              break
      
      Nan ? Après on part dans les map, oneliner et autres joyeusetés mais là ça reste clair et on évite des se taper tout le fichier pour root par exemple.
    • [^] # Re: Chez moi ça marche...

      Posté par  . Évalué à 1.

      J'avais mis les str() parce que je voulais être sûr de comparer la même chose, parce que justement ça ne marchait pas.
      Avec ton code, ça fonctionne, avec le mien, non.
      Une subtilité avec readlines?
      En tout cas merci, j'ai appris une autre façon de faire que mon usine à gaz.
      • [^] # Re: Chez moi ça marche...pas

        Posté par  . Évalué à 1.

        Ca ne fonctionne pas toujours. exemple:
        #!/usr/bin/env python
        # -*- coding: iso-8859-15 -*-
        
        for i in file('/etc/passwd','r'):
        	login=i.split(':')[0] # on récupère le login
        	shellus=i.split(':')[6] # on récupère le shell complet utilisateur
        	shellus2=str(shellus.split('/')[2]) # on récupère le shell utilisateur
        	if  shellus2 == 'bash' :
        		shellact="bash"
        	else:
        		shellact="autre"
        	print login,shellus2,shellact
        
        Je n'arrive pas à comprendre pourquoi ma comparaison est toujours fausse. Quand je fais un print de shellus2, jai bien "bash" qui s'affiche, mais quand je le compare à "bash", c'est toujours le else qui passe. J'ai essayé en mettant str(shellus2), mais pas moyen... Ca me stresse, parce qu'en bash ça me prendrait une poignée de secondes pour que ça fonctionne... Une idée?
        • [^] # Re: Chez moi ça marche...pas

          Posté par  . Évalué à 1.

          J'ai une piste:
          si je fait un print "*********"+shellus2+"*******" je m'apperçois qu'il me prend le saut de ligne dans la variable shellus2.
          Ce qui est somme toute logique avec le split.
          Comment puis je m'en débarasser, ou ne prendre que le texte sans le saut de ligne ?
          • [^] # Re: Chez moi ça marche...pas

            Posté par  (site web personnel) . Évalué à 1.

            strip()
            • [^] # Re: maintenant, si!

              Posté par  . Évalué à 1.

              Merci, c'était bien strip qui me fallait. Pour info, le code qui fonctionne:
              #!/usr/bin/env python
              # -*- coding: iso-8859-15 -*-
              
              for i in file('/etc/passwd','r'):
              	login=i.split(':')[0] # on récupère le login
              	shellus=i.split(':')[6] # on récupère le shell complet utilisateur
              	shellus2=str(shellus.split('/')[2]) # on récupère le shell utilisateur
                      shellus2=.shellus2.strip('\n')
              	if  shellus2 == 'bash' :
              		shellact="bash"
              	else:
              		shellact="autre"
              	print login,shellus2,shellact
              

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.