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

Réseau/Web Python Discussion :

recherche d'1 chaine ds un fichier txt en python


Sujet :

Réseau/Web Python

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut recherche d'1 chaine ds un fichier txt en python
    Bonjour,
    aidez moi SVP c très urgent.
    J'etouffe
    Donc voilà mon code je veux que lorsque le client envoie une cmd existante dans le tableau le serveur lui repond la reponse qui est mise à la case l[i+1] de la case de reponse située dans l[i]. Je ne sais pas pourquoi quand je tape la chaine il me répond tjs le message écrit dans l'exception. les fichies seront à votre disposition.
    Vous pouvez les tester sous dos.
    le fichier c:\python25\benj.txt voilà son contenu:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    jj#oo
    bg#cd
    azerty#qwerty
    bs#bn
    le fichier serveur:

    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
    class tel():
     
        print "recopier un fichier en eliminant les lignes de remarques"
        fs = open("benj.txt","r")
        l=[]
     
     
        for ligne in file("benj.txt"):
            i=0
            c1=""
            c2=""
            while i<len(ligne) and ligne[i]!="#":
                c1=c1+ligne[i]
                i=i+1
     
            i=i+1
     
            while i<(len(ligne)):
                c2=c2+ligne[i]
                i=i+1
     
            l.append(c1)
            l.append(c2.strip())
        fs.close()
        print l
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
     
        def handle(self):
     
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tel()
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    le fichier client:

    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    # Definition d"un client reseau gerant en parallele l'emission
    # et la reception des messages (utilisation de 2 THREADS).
     
    host = '127.0.0.1'
    port = 84
     
    import socket, sys, threading
     
    class ThreadReception(threading.Thread):
        """objet thread gerant la reception des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # ref. du socket de connexion
     
        def run(self):
            while 1:
                message_recu = self.connexion.recv(1024)
                print "Ser>" + message_recu 
     
            # Le thread <reception> se termine ici.
            # On force la fermeture du thread <emission> :
     
            print "Client arrete. Connexion interrompue."
            self.connexion.close()
     
    class ThreadEmission(threading.Thread):
     
        """objet thread gerant l'emission des messages"""
        def __init__(self, conn):
            threading.Thread.__init__(self)
            self.connexion = conn           # ref. du socket de connexion
     
        def run(self):
            message_final=""
            while 1:
                message_final=""
                message_emis = raw_input()
                message_final = message_final + " \n "+ message_emis
                self.connexion.send(message_final)
     
     
     
    # Programme principal - etablissement de la connexion :
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        connexion.connect((host, port))
    except socket.error:
        print "La connexion a echoue."
        sys.exit()    
    print "Connexion etablie avec le serveur."
     
    # Dialogue avec le serveur : on lance deux threads pour gerer
    # independamment l'emission et la reception des messages :
     
    th_E = ThreadEmission(connexion)
    th_R = ThreadReception(connexion)
    th_E.start()
    th_R.start()

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Salut,
    je crois que j'ai su l'erreur.
    c'est dans le niveau de l'appelle de la liste l dans la deuxieme classe.
    Cette classe ne reconnais pas la liste.
    Dans comment faire pour qu'elle en reconnais.

  3. #3
    Membre confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    Par défaut
    la variable l n'est visible que localement dans la classe tel() (qui ressemble plus à fonction qu'à une classe)
    ce qu'il te faut, c'est que d'une manière ou d'une autre l passe dans handle :
    - soit tu fais une variable globale (bof)
    - soit tu appelles tel depuis Handle :
    -> tu transformes tel en fonction retournant l
    -> et dans le handle

  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 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cboudy Voir le message
    ...classe tel() (qui ressemble plus à fonction qu'à une classe)
    C'est assez exact...
    Citation Envoyé par cboudy Voir le message
    -> tu transformes tel en fonction retournant l
    -> et dans le handle
    Ou si vraiment tu veux garder ta classe tel, tu y rajoutes la méthode "__call__(self):" qui retourne juste l et tu fais comme l'a dit cboudy =>
    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 à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Je suis totalement convaicue par vos idées merci
    Mais lorsque j'ai essayé de les appliquer voilà ce que c'est passé:
    1)une erreur pour ce code disant que variable globale l est inexistante ou manquante:

    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
        def _init_(self):
     
            l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    l.append(commande.strip())
            print l   
            return l
     
     
        def handle(self):
            print "la liste est:"
            print l
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    2)en executant ce code print l de la 2eme classe m'envoie ceci :
    --> <__main__.tel instance at 0x00C3AFA8>

    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
    class tel():
        def _call_(self):
            l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    l.append(commande.strip())
            print l   
            return l
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
     
        def handle(self):
            l=tel()
            print "la liste est:"
            print l
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=l.index(dr)
                    print ind
                    msg= str(l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    Où est l'erreur?? j'ai pas compris.
    J'ai une question qui peut sembler un peu débile mais puisque je suis débutante en python: On met _init_ avec un seul tiré bas ou deux __init__? Et est ce que ceci est important?

    Merci

  6. #6
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par tsicc Voir le message
    J'ai une question qui peut sembler un peu débile mais puisque je suis débutante en python: On met _init_ avec un seul tiré bas ou deux __init__? Et est ce que ceci est important?
    C'est bien avec 2 blancs soulignés avant et après (__init__).

    Et oui, c'est important. Je te suggère d'étudier un peu les mécanismes d'héritage.

    Quand tu déclares la classe avec "class GestionnaireEcho(SocketServer.BaseRequestHandler):", tu crées en fait une classe dérivée de "SocketServer.BaseRequestHandler" qui va hériter de son contenu. La méthode __init__ sert à initialiser ta nouvelle classe, et elle sera automatiquement exécutée lors de la création de l'instance (=affectation à une variable). Mais elle doit aussi faire le lien avec la classe parente par un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SocketServer.BaseRequestHandler.__init__(...)
    Inspire toi de l'exemple ici:

    http://www.oreillynet.com/onlamp/blo...ketserver.html

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    merci pour éclaircir cette idee de __init__. J'ai modifié ma classe comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
        def __init__(self):
            SocketServer.BaseRequestHandler.__init__(self)
            l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    l.append(commande.strip())
            print l   
            return l

    Mais ça pas régler le problème. (Peut etre j'ai pas bien compris ce que vous voulez dire)
    C'est important pour moi de savoir où est l'erreur dans les deux codes écrits précedemment.
    Merci

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Telle que tu l'as mise, la variable l n'est qu'une variable locale à la méthode __init__, et sera donc détruite à la fin d'exécution de cette méthode. Ce n'est probablement pas ce que tu souhaitais...

    Il suffit de préfixer avec "self". En fait, self.l sera une variable globale pour l'instance de classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
        def __init__(self):
            SocketServer.BaseRequestHandler.__init__(self)
            self.l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    self.l.append(commande.strip())
            print self.l
    (tu retires ton "return l")

    Avec cette initialisation, la variable "self.l" peut être récupérée et traitée dans toutes les autres méthodes de la classe. Ainsi d'ailleurs qu'à l'extérieur de la classe avec comme préfixe l'instance.

    Regarde de nouveau l'exemple dont je t'ai donné l'adresse plus haut, et vérifie que c'est bien comme ça que ça marche.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Je suis vraiment désolée. ça n'a pas marché et je ne sais pas pourquoi.
    Voilà l'erreur qu'il m'affiche quand le client se connecte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Exception happened during processing of request from ('127.0.0.1', 1322)
    Traceback (most recent call last):
      File "C:\Python25\lib\SocketServer.py", line 464, in process_request_thread
        self.finish_request(request, client_address)
      File "C:\Python25\lib\SocketServer.py", line 254, in finish_request
        self.RequestHandlerClass(request, client_address, self)
    TypeError: __init__() takes exactly 1 argument (4 given)
    et voilà encore le code de mon serveur:
    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    from socket import *
    import socket, sys, threading
    import SocketServer
    import time
    import locale
     
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
        def __init__(self):
            SocketServer.BaseRequestHandler.__init__(self)
            self.l = []
            for ligne in open('benj.txt'):
                for commande in ligne.split('#'):
                    self.l.append(commande.strip())
            print self.l   
     
     
     
        def handle(self):
            print "la liste est:"
            print self.l
            locale.setlocale(locale.LC_ALL,'')
            c= time.strftime('%A %c')
            print "Connexion de ", self.client_address,c
            while True:
                donneesRecues = self.request.recv(8192)
                t=time.strftime("%H:%M:%S")
                print "\n C ",t, "> ", donneesRecues
                dr=str(donneesRecues)
                try:
                    ind=self.l.index(dr)
                    print ind
                    msg= str(self.l[ind+1])
                except:
                    msg="commande erronee"
     
                self.request.send(msg)
     
            print "Deconnexion de ", self.client_address
     
     
    mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     
    try:
        serveur = SocketServer.ThreadingTCPServer(('127.0.0.1',84), GestionnaireEcho)
    except socket.error:
        print "La liaison du socket a l'adresse choisie a echoue."
        sys.exit()
     
    print "En attente..!!!!"
     
     
    serveur.serve_forever()
    je ne sais pas quoi faire je suis bloquée.

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Désolé, mais ton projet est trop compliqué pour moi...

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut

    Salut,
    mon code n'est pas compliqué.C'est juste qu'il y a une mauvaise place des commandes ou peut etre une mauvaise utilisation.
    Où sont cboudy et Sve@r qui m'ont données les 1ers idées.
    S'il vous plait ne lacher pas le code c'est très important

  12. #12
    Membre confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    Par défaut
    le message dit que dans le constructeur de ta classe derivée tu ne demande qu'un argument alors qu'il en faut quatre

    dans l'exemple de tyrtamos, ils mettent bien 4 args :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def __init__(self, request, client_address, server):
            self.logger = logging.getLogger('EchoRequestHandler')
            self.logger.debug('__init__')
            SocketServer.BaseRequestHandler.__init__(self, request, client_address, server)
            return

  13. #13
    Membre à l'essai
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    ok
    Mais le probleme persiste encore dans la ligne
    ind=self.l.index(donneesRecues)
    Comme si cette ligne fait une exception.
    Alors quand je la remplace par une chaine qui existe dans le fichier ça marche normalement comme prévu
    NB:donneesRecues ce sont les donnees envoyées par le client et dont le serveur doit tester pour donner une reponse appropriée située dans la liste dans la case qui suit la case de la cmd.


    J'ai changé le code de recherche comme suit mais rien n'a chagé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                ch=""
                dr=""
                for ch in self.l:
                    if ch == donneesRecues :
                        dr=self.l[self.l.index(ch)+1]
                print "dr est = %s"%(dr)
                if len(dr)==0:
                    msg="commande erronee"
                else:
                    msg=dr
                self.request.send(msg)

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Ça, c'est normal : la méthode index sur une liste déclenche une exception ValueError si l'objet recherché n'est pas dans la liste.

    Il faut donc gérer cela avec un try: except:.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre confirmé Avatar de cboudy
    Profil pro
    Ingénieur informatique industrielle
    Inscrit en
    Avril 2006
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur informatique industrielle
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 406
    Points : 616
    Points
    616
    Par défaut
    tu peux aussi vérifier que la chaîne est comprise dans la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if ch in self.l :
        ...
    else:
        ...
    ou alors avec l'aide d'un

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Comme je suis très très curieux, je m'y suis remis

    Et comme c'est plus facile à recoder qu'à déverminer, voilà ce que je propose: un ensemble client-serveur très simple et qui marche. De plus il est threadé: chaque nouvelle requête est traitée dans un nouveau thread, ce qui fait qu'une nouvelle requête n'a pas besoin d'attendre que la précédente soit terminée.

    Le serveur:

    Code : 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
    35
    36
    37
    38
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    # Serveur TCP
    # inspiré de: http://blog.doughellmann.com/2007/12/pymotw-socketserver.html
    # chaque nouvelle requête est traitée dans un nouveau thread
    #    => une nouvelle requête n'a pas besoin d'attendre la fin de la précédente
     
    import SocketServer
    import threading
     
    ##############################################################################
    class Traitementrequete(SocketServer.BaseRequestHandler):
     
        def handle(self):
     
            # lit la requête
            requete = self.request.recv(1024)
     
            # renvoie la réponse à la requête (ici = requête)
            reponse=requete
            self.request.send(reponse)
     
            return
     
    ##############################################################################
    class Serveurthread(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
        pass
     
    ##############################################################################
    if __name__ == '__main__':
     
        adresse = ('192.168.0.99', 20000)
        serveur = Serveurthread(adresse, Traitementrequete)
        print "serveur actif"
        serveur.serve_forever()
        #server.socket.close()
    Et voilà le client:

    Code : 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
     
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    # Voir http://blog.doughellmann.com/2007/12/pymotw-socketserver.html
     
    import socket
     
    ##############################################################################
    if __name__ == '__main__':
     
        # Etablissement de la connexion
        maSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        maSocket.connect(('192.168.0.99', 20000))
     
        # Envoie la requête
        requete = 'Bonjour!'
        print 'Envoi : "%s"' % requete
        len_sent = maSocket.send(requete)
     
        # Réception de la réponse
        reponse = maSocket.recv(1024)
        print 'Réception: "%s"' % reponse
     
        maSocket.close()
    Attention à plusieurs points:

    1- ce n'est pas une bonne idée d'initialiser avec __init__ la classe Traitementrequete parce que j'ai les mêmes erreurs (il manque plusieurs arguments que je ne sais pas initialiser). Il est beaucoup plus simple d'initialiser dans le "main" du serveur et de placer les données en variables globales (je pense à "l"), ou même en attribut dans l'instance de classe (à condition de le prévoir).

    2- le serveur ne doit pas se lancer à partir d'un outil de développement, mais d'une simple console. Et ce serveur ne s'arrête qu'en tuant le processus correspondant (="python").

    Maintenant, ça devrait être plus facile de terminer ce projet.

    Ok?

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. rechercher les champs BDD dans des fichiers .txt
    Par twixi dans le forum Linux
    Réponses: 6
    Dernier message: 16/03/2009, 13h20
  2. Recherche d'une chaine dans un fichier distant
    Par nitramm dans le forum ASP
    Réponses: 3
    Dernier message: 20/08/2008, 16h49
  3. Recherche d'une phrase dans un fichier txt
    Par beegees dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/07/2007, 08h44
  4. [code]Recherche d'une chaine dans des fichiers
    Par guillaume_pays_ceven dans le forum Contribuez
    Réponses: 5
    Dernier message: 21/06/2007, 14h32
  5. [MFC] Chaine dans un fichier txt
    Par le-makinero dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 10h10

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