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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 : 74
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    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
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    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
    Membre averti
    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
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    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 833
    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]

  7. #7
    Membre averti
    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
    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

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    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

  9. #9
    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 : 74
    Localisation : Belgique

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

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    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.)

+ 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