IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Condition qui ne s'effectue pas [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut Condition qui ne s'effectue pas
    Bonjour.

    J'ai fais un script simple que je développerais, modifierais par la suite.
    Ici il y a que le commencement de base. J'ai un souci concernant les conditions dans ce script.
    Que je sois connecté avec le vpn ou non j'ai toujours la même réponse ( ip a changer).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import os
     
    vpn = 1316232503                                  # ip vpn "78.116.29.55" str converti en int = 1316232503   
    curl = os.system("curl ipinfo.io/ip")             # int
     
    if curl == vpn:
        print("bonne ip")
    elif curl != vpn:
        print("ip a changer")
    else:
        print("none")
    La chaîne vpn est un string avec l'ip "78.116.29.55" , curl un entier.
    J'ai alors converti vpn en entier à la place de la chaîne, mais j'ai toujours le même résultat ( ip a changer) en déconnectant le vpn ou en le remettant.

    Je remarque qu'en tapant curl sur la console, j'obtiens le code 0 et non l'ip.
    Hors je pense que le problème vient de là. Je suis en apprentissage de python autodidacte mais je n'ai pas assez d'expérience pour remédier à ce problème.

    j'execute et vpn connecter:
    >>>
    78.116.29.55
    ip a changer

    j'execute sans vpn:
    >>>
    78.116.29.55
    ip a changer

    >>> curl
    0

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut


    Vous ne pouvez pas comparer un int avec le contenu de curl :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    import struct
    import socket
    import os
     
    curl = os.system("curl ipinfo.io/78.116.29.55")
     
    print(curl)
     
    '''
    {
      "ip": "78.116.29.55",
      "hostname": "55.29.116.78.rev.sfr.net",  
      "city": "Douai",
      "region": "Hauts-de-France",
      "country": "FR",
      "loc": "50.3707,3.0792",
      "org": "AS8228 SFR SA",
      "postal": "59351 CEDEX",
      "timezone": "Europe/Paris",
      "readme": "https://ipinfo.io/missingauth"
    }0
    '''
     
     
    def ip2int(addr):
        return struct.unpack("!I", socket.inet_aton(addr))[0]
     
     
    def int2ip(addr):
        return socket.inet_ntoa(struct.pack("!I", addr))
     
     
    print(int2ip(1316232503))  # 78.116.29.55
    print(ip2int('78.116.29.55'))  # 1316232503

    J'ai testé avec l'adresse de mon modem, les renseignements fournis par curl ne sont pas fiables.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par ati00 Voir le message
    Je suis en apprentissage de python autodidacte mais je n'ai pas assez d'expérience pour remédier à ce problème.
    Ce n'est pas un problème Python à proprement parler mais de compréhension de ce que fait os.system.

    Il se contente de lancer la commande et de retourner un status sous la forme d'un entier entre 0 et 255 qui dira si la commande s'est exécutée ou pas sans problème.
    Vous ce que vous voulez récupérer, c'est ce que la commande affiche à l'écran (après avoir testé le status).

    Pour çà il est préférable d'utiliser subprocess:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from subprocess import check_output
    curl = check_output("curl ipinfo.io/ip", shell=True)
    print(curl)
    Et comme curl sera une chaine de caractères (mais des bytes), vous savez à quoi la comparer pour tester.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En plus de ton erreur sur le comportement de os.system(), moi je m'interroge sur ton alternative binaire à 3 sorties.
    Tu commences par tester si curl est égal à vpn, puis si curl est différent de vpn. Et sinon tu affiches "none".

    Et donc c'est quoi pour toi ce 3° état mystérieux où curl ne serait ni égal ni différent de vpn ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    danielhagnoul: Vous ne pouvez pas comparer un int avec le contenu de curl
    Sur un navigateur l'adresse http://ipinfo.io/ip donne que l'ip, mais après l'échec du script je me doutais un peu que curl ne donner pas que l'adresse ip, surtout que le test de booléen entre vpn et curl donner False. Merci d'avoir essayer ton script vérificateur.

    wiztricks: Ce n'est pas un problème Python à proprement parler mais de compréhension de ce que fait os.system.
    C'est que os.system je ne dois pas l’utiliser pour ce cas, je me rend compte que je capture que le code de retour de la commande.
    Pour le code avec subprocess et mon code, cela ne fonctionne pas mais merci de ton code, je le retenterais demain ou Mardi.
    Mais je vais écarter os.system du script et le remplacer.

    Sve@r[: En plus de ton erreur sur le comportement de os.system(), moi je m'interroge sur ton alternative binaire à 3 sorties
    Pour l'alternative à 3 sorties else est inutile tu as raison je l'ai mis et cela ne mange pas de pain dans ce test. les conditions c'est pour simplifier le script ici mais après les conditions seront remplacer par une boucle, etc ... pour faire une alternative à Ip Indicator, j’utiliserais notify-send etc.. Mais je comprend pour toi à la base cela peut paraître sans valeur ce test.
    Le test des conditions doit fonctionner pour que je puisse ensuite finaliser mon script, parce que le principal c'est si le l'ip du vpn est connecter ou si elle ne l'ai pas.
    Bonne soirée.

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Pour interroger https://ipinfo.io/, je vous recommande l'usage du module Python Geocoder : https://geocoder.readthedocs.io/

    Pour l'installer : pip install geocoder voir : https://pypi.org/project/geocoder/

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    import geocoder
     
    g = geocoder.ipinfo("78.116.29.55")
     
    print(g.ip)
    print(g.json)

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ati00 Voir le message
    je l'ai mis et cela ne mange pas de pain dans ce test.
    Si, cela mange du pain. Le processeur fera 2 comparaisons là où une suffit

    Citation Envoyé par ati00 Voir le message
    Les conditions c'est pour simplifier le script ici
    Simplifier je comprends (une des philosophies Python est justement que la simplicité est préférable à la complexité). Toutefois ta façon de simplifier je comprends moins... print("bonne ip" if curl == vpn else "ip à changer").

    Citation Envoyé par ati00 Voir le message
    Pour le code avec subprocess et mon code, cela ne fonctionne pas mais merci de ton code, je le retenterais demain ou Mardi.
    Mais je vais écarter os.system du script et le remplacer.
    Tu peux essayer ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import subprocess
    curl=subprocess.Popen(("curl", "ipinfo.io/ip"), stdin=None, stdout=subprocess.PIPE).stdout.read()

    Et pour plus de détails sur subprocess, ses paramètres et la façon de récupérer son résultat, voir ici.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Super!! @ danielhagnoul
    je te remercie de me faire connaître geocoder. je vais lire la documentation tout à l'heure, ça à l'air top je le garde à la fin, et je ferai un essai juste après. Je te tiens au courant. Merci


    @Sve@r
    Lorsque j'avais écris les conditions, je me suis en plus dit " else: none " est inutile de l'ajouter mais je l'ai mis, pour tester quand même. Sur 20 ou 30 fois d'échec sur '==' ou '!=' je suis tombé 1 seul fois sur 'none' et je sais plus comment. lol
    Merci de ta nouvelle commande, j'ai essayé mais cela me donne une ip de type Bytes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    import os 
    import subprocess
     
    curl = subprocess.Popen(("curl", "ipinfo.io/ip"), stdin=None, stdout=subprocess.PIPE).stdout.read() 
     
    vpn = "78.116.29.55".encode()      # ip str converti en bytes
     
     
    if curl == vpn:
        print("bonne ip")
    if curl != vpn:
        print("autre ip")
    Bon cela me gène pas au contraire cela me fais apprendre.
    Je suis parti alors rechercher sur le net pour convertir un str en bytes, et ici je converti l'ip vpn en bytes. Le problème l'ip de curl en byte à le retour chariot à la fin \n.
    Si je la compare à l'ip vpn bytes elles apparaissent semblable mais ne le sont pas pour Python.
    La condition ne peut fonctionner pour '=='.

    >>> curl
    b'78.116.29.55\n'
    >>> vpn
    b'78.116.29.55'
    Bon je repose ma tête chaude aujourd'hui, je ne sais pas si c'est vraiment Python ou bien la chaleur du moi d'Août lol

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par ati00 Voir le message
    Jje ne sais pas si c'est vraiment Python ou bien la chaleur du moi d'Août
    Pourquoi écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vpn = "78.116.29.55".encode()
    plutôt que:
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vpn = b"78.116.29.55\n"
    Et si vous ne voulez pas triturer "vpn": curl.decode().strip()

    De toutes façons quand vous récupérer la sortie d'un programme, ce seront des chaines de caractères qu'il faudra retravailler... Autant connaitre les méthodes de base pour le faire car peu importe dans ce que vous voudrez coder, il faudra les connaître.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Salut wiztricks.

    Pourquoi écrire:
    vpn = "78.116.29.55".encode()
    Forcément que je ne peux savoir ces commandes, je ne les ai pas étudier, je sais bien qu'il faut étudier avant ( et j'ai appris déjà des bases d'un livre, c'est impossible de tout savoir en tant que débutant et python c'est vaste ) ,et je ne pensais partir sur d'autre voie et en l’occurrence sur la conversion en bytes, donc pour mon problème j'ai voulu le résoudre vite et j'en suis pas loin. J'ai passé la mâtiné à régler mon problème.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    Formidable !! cela fonctionne directement avec geocoder.
    Je te remercie beaucoup @danielhagnoul c'est ce qui me fallait, en plus il y a des options intéressante pour le futur.
    Trop content que ça fonctionne, vpn connecter ou déconnecter la condition fonctionne parfaitement.


    Voici le code corriger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    import geocoder
     
    g = geocoder.ipinfo('me')
    g = g.ip
     
    data = "78.116.29.55"      
     
    if g == data:
        print("bonne ip")
    elif g != data:
        print("autre ip")
    En python il y a tant de façon pour arriver au but.
    Il me reste maintenant, à modifier mon script en plus sophistiquer mais cela devrait aller.

    Mon problème est résolu. J’étudierais subprocess et bytes.
    Merci les amis, je met en résolu.

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ati00 Voir le message
    En python il y a tant de façon pour arriver au but.
    Oui mais tester l'égalité est sinon tester la différence ça fait quand-même partie des pires.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import geocoder
    print("bonne ip" if geocoder.ipinfo('me').ip == "78.116.29.55" else "autre ip")
    Citation Envoyé par ati00 Voir le message
    Sur 20 ou 30 fois d'échec sur '==' ou '!=' je suis tombé 1 seul fois sur 'none' et je sais plus comment. lol
    C'était un état quantique intriqué.
    Plus sérieusement c'est totalement impossible. Deux choses sont soit égales entre elles, soit non. Il n'y a pas de 3° choix. Je ne dis pas que tu n'as pas eu "none" à l'écran mais il est possible que ton code ait été alors un peu différent et que le "none" ait été mis (par exemple) dans le cas du "else" (une tabulation malencontreuse et une instruction qu'on croyait en dehors d'un bloc se retrouve en fait dans le bloc). Ou autre situation qui fait que "none" s'affiche alors qu'on reste dans l'une des deux seules alternatives possibles.

    Citation Envoyé par ati00 Voir le message
    Mon problème est résolu. J’étudierais subprocess et bytes.
    Les bytes sont les chaines encodées en ascii (c'étaient les "str" sous P2). Or le nom "str" a été conservé sous P3 mais fait maintenant référence à l'unicode. Et donc un des soucis du portage P2 => P3 c'est que certaines librairies qui retournaient des str sous P2 ont eu à choisir entre "retourner la même chose" (donc des bytes) ou "retourner ce qui s'appelle pareil" (donc changer l'encoding du truc retourné puisque le même nom fait référence à une chaine encodée différemment) et ont choisi de retourner la même chose sous P3 => donc des bytes
    Je vais pas critiquer (je pense que les concepteurs ont eu à faire un choix et ont choisi ce qu'ils estimaient être le moins pire). Il faut juste en être conscient. Perso quand j'utilise une librairie qui me retourne des trucs déjà je regarde ce qu'elle retourne puis j'essaye de convertir tout ce qui entre en unicode (ce qui maintenant se nomme "str"sous P3) le plus tôt possible pour "tenter" d'être le plus serein ensuite dans mon code.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Futur Membre du Club
    Homme Profil pro
    en stage de formation
    Inscrit en
    Mars 2019
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : en stage de formation

    Informations forums :
    Inscription : Mars 2019
    Messages : 22
    Points : 9
    Points
    9
    Par défaut
    @Sve@r
    Oui je suis d'accord avec ta bonne analyse et l'apparition de none cela du arriver comme tu le décrit.
    Je confirme ton code est nickel en remédiant avec ma mauvaise conversion bytes corriger par @wiztricks le script fonctionne parfaitement.

    Merci de ton commentaire sur Bytes, je ne savais rien de tout ça.
    Merci à vous tous et bonne soirée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Mail] Conditions qui ne s'effectuent pas
    Par oceane751 dans le forum Langage
    Réponses: 3
    Dernier message: 13/11/2007, 23h54
  2. [Conception] requete qui ne s'effectue pas correctement
    Par eclipse012 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/01/2007, 12h06
  3. Réinitialisation d'objets qui ne s'effectue pas
    Par djalouk dans le forum Langage
    Réponses: 1
    Dernier message: 26/01/2007, 09h49
  4. [VB.NET] autopostback qui ne s'effectue pas
    Par pcdj dans le forum ASP.NET
    Réponses: 5
    Dernier message: 21/06/2006, 13h50
  5. [C#] Redirection qui ne s'effectue pas
    Par Ditch dans le forum ASP.NET
    Réponses: 5
    Dernier message: 18/10/2004, 20h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo