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 :

Envoi de liste 2D par socket


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Envoi de liste 2D par socket
    Bonjour,

    Je réalise un jeu en réseau et j'ai a un moment besoin d'envoyer a chaqun de mes clients une matrice qui corresponds a une grille. Le probleme est qu'on ne peut envoyer que des str avec la méthode socket.send() du module socket de python.

    Je cherche donc de transformer une matrice en str.

    J'ai fais quelques tests :

    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
     
    >>> liste=[[0]*10]*10 # generation d'une matrice contenant des entiers 0
    >>> liste
    [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] # je me rends compte que c'est trop grand pour un exemple ... -_-
    >>> liste=[[0]*3]*3
    >>> liste
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # c'est mieux comme ça :o)
    >>> texte=str(liste)
    >>> texte
    '[[0, 0, 0], [0, 0, 0], [0, 0, 0]]'
    >>> # client ...
    ... 
    >>> nouvelle_liste1=list(texte)
    >>> nouvelle_liste1
    ['[', '[', '0', ',', ' ', '0', ',', ' ', '0', ']', ',', ' ', '[', '0', ',', ' ', '0', ',', ' ', '0', ']', ',', ' ', '[', '0', ',', ' ', '0', ',', ' ', '0', ']', ']']
    >>> nouvelle_liste2=texte.split(",")
    >>> nouvelle_liste2
    ['[[0', ' 0', ' 0]', ' [0', ' 0', ' 0]', ' [0', ' 0', ' 0]]']
    Enfin bon je vais pas tout vous copier/coller
    Juste a rajouter que j'ai essayé avec des split, puis des join, dans des boucles. Mais sa marche toujours pas ...

    Je suis cependant tout a fais sûr qu'il y a un moyen ! Mais lequel, pourriez vous m'aider ? Merci !

  2. #2
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Le moyen le plus simple, et certainement le plus efficace, pour passer des types python c'est la sérialisation.
    Dans ton cas, je te conseille pickle, puisque tu ne sais pas si l'autre pc a la même architecture que toi.

    (code non testé, mais il devrait fonctionner)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try:
        import cPickle as pickle
    except ImportError:
        import pickle
     
    # ...
    # Obtenir un socket
    # ...
     
    data = pickle.dumps(maList, pickle.HIGHEST_PROTOCOL)
    socket.send(data)
    Et de l'autre côté, c'est pickle.loads

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Génial !!

    J'ai finalement trouvé une solution sur un autre forum. Elle n'est pas du tout comme je pensais qu'elle serait mais sa marche excellent !

    Je vous montre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> import marshal
    >>> mat = [[0]*3]*3
    >>> mat_dump = marshal.dumps(mat) #pour mettre le contenu dans une variable, la fonction 'dump' sert à mettre dans un fichier
    >>> mat_dump
    '[\x03\x00\x00\x00[\x03\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00[\x03\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00[\x03\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00i\x00\x00\x00\x00' #c'est une str, ce qu'il faut
    >>> marshal.loads(mat_dump)
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

    Voilà, pas plus compliqué que ça

    Merci quand meme

  4. #4
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Attention avec le marshalling... c'est dépendant de l'architecture du pc, de la version de python etc...
    Tu risques donc de rencontrer des soucis tôt ou tard.

    cfr. http://www.python.org/doc/2.1.1/lib/module-marshal.html
    Edit: d'ailleurs au temps pour moi, il semblerait que ce ne soit pas dépendant de l'architecture. Mais bien de la version de python. Méfiance donc.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Désolé, je n'avais pas vu ta réponse quand j'ai rajouté la mienne

    Mais qu'importe, me voilà prévenu.

    Je pense de toute façon compiler le code pour en sortir un exe. Et apparment le module marshal est installé par défaut au moins apartir de la v. 2.5

    Je vais pour l'instant rester sur cette méthode.

    Merci tout de meme du renseignement !

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

Discussions similaires

  1. Envoi d'une valeur par socket
    Par bibom dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/06/2007, 14h04
  2. débutant : envoi d'un String par socket impossible
    Par 2tsiris dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 26/02/2007, 18h17
  3. Envoi d'un fichier par socket
    Par Aleksis dans le forum C++
    Réponses: 12
    Dernier message: 12/08/2006, 05h10
  4. Réponses: 3
    Dernier message: 06/03/2006, 10h36
  5. Ouverture de connexion et envoi d'un message par socket
    Par loleske dans le forum C++Builder
    Réponses: 3
    Dernier message: 10/02/2005, 12h52

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