Adresse ip sous forme de variable [Résolu]

Signaler
-
Messages postés
29713
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
13 avril 2021
-
Bonjour à tous,

Langage Python 3.7

L'idée c'est d'envoyer, en UDP, des données en utilisant un fichier ini pour stocker l'adresse ip de destination. J'utilise pour cela le code suivant :

sock.sendto ((MESSAGE_3), ((UDP_IP), int(UDP_PORT)))

Qui marche nickel si la variable UDP_IP est définie en dur dans le code via

UDP_IP = "192.168.18.224"

Mais qui ne fonctionne pas quand je récupère l'adresse ip en lisant un fichier ini, par exemple :

fichier = open("toto.ini", "r")
for i in range(4):
UDP_IP = fichier.readline()
fichier.close()

Voici l'erreur obtenue "socket.gaierror: [Errno 11001] getaddrinfo failed"

Je suppose donc que j'ai un problème de type de variable...

Bon vous avez compris que le garçon débute :-)

Merci d'avance


Configuration: Windows / Firefox 87.0

9 réponses

Messages postés
29713
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
13 avril 2021
7 067
Bonjour,

Le contenu de
toto.ini
mais généralement, un fichier ini ne contient pas une valeur toute seule.

Pour lire un fichier je te conseille d'utiliser le mot clé
with
(cf cours sur les context managers), c'est bien plus propre.

Je n'ai pas non plus compris à quoi correspondait ta boucle for. Je t'invite donc à contrôler le contenu de ta valeur
UDP_IP
une fois que tu l'as chargée e.g. avec un
print(UDP_IP)
.

Dernier point : réfléchis au format de ton fichier de configuration. Dans le cas particulier des fichiers
.ini
, il y a une syntaxe standard et donc un parseur python directement disponible (voir ce lien). D'autres formats de fichiers peuvent être considérés (e.g.
json
). Personnellement je préfère les fichiers json mais ça c'est une affaire de goût.

Bonne chance
Salut Mamie :-)

Merci pour ta réponse, mais en fait la lecture du fichier ini fonctionne très bien ( j'ai mis un bout du code seulement pour simplifier la demande)
Donc mon fichier ini est bien parsé, la valeur de l'adresse ip est bien lue et mise dans la valeur de la variable.
Si je fais un print UDP_IP dans la console j'ai bien la valeur lue dans le fichier ini.
Sauf que quand je balance cette variable dans le sock.sendto elle n'est pas reconnue.
Alors que l'adresse est reconnue quand elle est codée en dur dans la mme variable .
Interresting ?
Merci encore.
BlackFlag
Messages postés
29713
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
13 avril 2021
7 067
Bonjour,

Peux-tu partager un script python minimal et le fichier ini correspondant qui met en évidence le problème ? Car une chaîne, c'est une chaîne :-) Et si à la sortie du parser, la chaîne contient la même valeur que celle que tu as codée en dur dans ton exemple, il n'y a pas de raison que le comportement soit différent. Tu peux en outre rajouter une assertion pour vérifier si la chaîne parsée contient bien la valeur attendue le temps de déboguer, comme par exemple :

assert UDP_IP == "192.168.18.224" 


Bonne chance
Bonjour Mamiemando,

Ok, je vais extraire un bout de code pour que tu puisses analyser le truc. C'est vrai que je trouve ça curieux aussi.

L'assert renvoie une erreur, alors que le print renvoie la bonne valeur.
Je pense que c'est une histoire de format, par exemple quand je code l'adresse en dur :
UDP_IP = "192.168.18.224"

Il y a les "" encadrant l'IP et ça marche.
Mais quand je le chope dans l'ini, même en ecadrant l'adresse avec des " dans l'ini...pas glop.

Je met le bout de code dans un second post.
En tout cas merci pour ton aide.
Alain
Re-Bonjour Mamie,

Pour tester le code UDP, je conseille l'utilitaire UDP sender/receiver gratos sur le WinStore et qui marche nickel.

Voici le bout de code :

import socket
import sys

UDP_IP = "192.168.18.224" # déclare variable adresse de destination et la fixe à .224

#Phase de récupérations des données du fichier ini (toto.ini)

#Lit le fichier ini et prend la ligne 4 puis la transforme en la valeur de la variable
fichier = open("toto.ini", "r")
for i in range(4):
    UDP_IP = fichier.readline()

fichier.close()


print ("L'adresse IP est maintenant :" , UDP_IP)
assert UDP_IP == "192.168.18.223" # commande debuggage pour vérifier si la valeur est ok
# 
# 

UDP_PORT = 65535 # déclare variable port destination et la déclare arbitrairement à 65535
# Lit le fichier ini et prend la ligne 7 puis la transforme en la valeur de la variable

fichier = open("ex-lpr.ini", "r")
for i in range(7):
    UDP_PORT = fichier.readline()
    
print (UDP_PORT)
fichier.close()


ENTETE_TRANSMISSION = "~"  # déclare variable de début de transmission port A du Bidule
FIN_TRANSMISSION = "end" # déclare variable de fin de transmission
CODE_TEST = "123456" # déclare un numéro de truc pour test
MESSAGE_3 = bytes(ENTETE_TRANSMISSION + CODE_TEST + FIN_TRANSMISSION, 'utf-8')

print ("le message 3 est :", MESSAGE_3) # affiche me message concaténé dans la console
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
sock.sendto ((MESSAGE_3), ((UDP_IP), int(UDP_PORT))) # int() est ajouté pour mettre la valeur du port en integer


Et voici le contenu du fichier toto.ini :

Je suis le fichier ini

Adresse IP du bidule ..../// mettre le valeur dans la ligne suivante
192.168.18.223

Port du bidule ..../// mettre le valeur dans la ligne suivante
65535


Bonne chasse ! et merci d'avance.
Alain
Messages postés
1013
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
12 avril 2021
112
Bonjour,

merci de copier/coller ici ton code complet avec les balises de code
mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()
Oups désolé je n'avais pas tout compris :-)

Je l'ai fait pour le code Python, par contre pour le contenu de l'ini j'ai laissé tel quel.

Pas encore habitué aux forums de codeurs, mais ça va venir !

Merci.

Alain
Messages postés
29713
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
13 avril 2021
7 067
Bonjour,

Si tu affiches le contenu de ta chaîne comme suit :

print ("L'adresse IP est maintenant : %r" % UDP_IP)


... tu verras que ta chaîne contient le retour à la ligne (\n).

La manière la plus simple de corriger ton script est la suivante :

UDP_IP = UDP_IP.strip()
print ("L'adresse IP est maintenant : %r" % UDP_IP)
assert UDP_IP == "192.168.18.223"


Ceci dit, plusieurs choses ne vont quand même pas mais peut-être que ça n'est pas gênant pour toi, alors je les liste juste pour information :
  • ton fichier ne respecte pas la syntaxe d'un fichier ini classique, du coup tu t'interdis d'utiliser un parseur de fichier ini sur étagère (voir la documentation) -- mais comme je le disais plus haut je préconise plutôt d'utiliser un fichier json.
  • ça n'a pas vraiment de sens de nommer une variable UDP_IP, car une IP n'est pas associée à un protocole (ni un port d'ailleurs). Ce serait plus logique de nommer ces variables SERVER_IP et SERVER_PORT par exemple.


Donc moi je ferais plutôt ceci :

#!/usr/bin/env python3

import json
from pprint import pprint

with open("toto.json") as f:
    config = json.load(f)
pprint(config)

#server_ip = config["server_ip"]
#server_port = config["server_port"]


toto.json
contient :

{
"server_ip" : "192.168.18.223",
"server_port" : 1234
}


Note l'absence de guillemets au niveau de la valeur associée à la clé "server_port" pour directement récupérer un entier et non une chaîne de caractère.

Bonne chance
Ah carrément top, merci ++ MamieMando !

Le "strip" marche nickel, quand au Json, je vais potasser car ça a l'air top.

Un petit peu d'histoire personnelle :
J'ai fait 1 mois de basic il y a ....42 ans ! Si si...
Et là, pour le boulot je replonge dans la programmation "lite". Bien entendu je l'ai fait bille en tête, total à l'arrache :-))
Il me semble donc urgent que je rentre dans un vrai processus d'autoformation.

En tout cas merci encore.
Alain
Messages postés
29713
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
13 avril 2021
7 067
Bonjour Alain,

Ah le basic, ça ne nous rajeunit pas effectivement. Tu verras python c'est assez simple donc tu ne devrais pas avoir trop de difficultés. Il y a beaucoup de tutoriels/cours gratuits disponibles sur internet, et le forum n'est jamais bien loin pour les coups durs :-)

Bonne continuation