Outils pour utilisateurs

Outils du site


pymultilame

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
pymultilame [2018/08/27 06:37] – [Installation] sergepymultilame [2021/08/21 15:47] – ↷ Liens modifiés en raison d'un déplacement. 216.244.66.228
Ligne 5: Ligne 5:
 </WRAP> </WRAP>
  
-=====Principe=====+=====Les sources sur GitHub===== 
 +  * **[[https://github.com/sergeLabo/pymultilame|pymultilame sur GitHub]]**
  
-=====Les sources sur github=====+===== pymultilame =====
  
-  * https://github.com/sergeLabo/pymultilame +==== Des scripts python pour les tâches répétitives. ====
-=====Installation=====+
  
-  * [[Python: Créer son propre package python]] +Ce module propose les outils les plus courrant que j'utilise, à utiliser en import ou en recopiant des bouts de code. 
-Installation: + 
-  sudo pip3 install -e git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame+Ce module est une amélioration de 
 + 
 +  * [[https://github.com/sergeLabo/mylabotools|mylabotools]] 
 + 
 +qui n'est plus maintenu. 
 + 
 +=== Rubriques proposées === 
 + 
 +  * Blender: Des scripts spécifiques pour le Blender Game Engine 2.7x et qui ne peuvent tourner que dans Blender 
 +  * Twisted: des exemples de twisted en python3 
 +  * Network: des sockets simples en python3 
 +  * Tools: des outils utilisés fréquement 
 + 
 +==== Installation ==== 
 + 
 +=== Installation de Twisted pour python 3.x === 
 + 
 +  * [[archives:installation_de_twisted|Python: Installation de Twisted]] 
 + 
 +<code> 
 +sudo pip3 install twisted 
 +</code> 
 + 
 +=== Installation de pymultilame === 
 + 
 +  * [[creer_son_propre_package_python|Python: Créer son propre package python]] 
 + 
 +<code> 
 +sudo pip3 install -e git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame 
 +</code>
  
 Mise à jour: Mise à jour:
-  sudo pip3 install --upgrade git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame 
  
-=====Utilisation=====+<code> 
 +sudo pip3 install --upgrade git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame 
 +</code>
  
-=====Aide===== +==== Utilisation ==== 
-Obtenu avec pydoc3.5+ 
 +<code python> 
 +# Imports en python3 
 +from pymultilame import HttpDownload 
 +from pymultilame import MyTools 
 +from pymultilame import TcpClient3 
 +from pymultilame import MyConfig 
 +from pymultilame import get_my_ip 
 +from pymultilame import Multicast 
 +from pymultilame import UdpClient 
 +from pymultilame import PileFIFO 
 +from pymultilame import Multicast 
 + 
 +from pymultilame import Tempo 
 +from pymultilame import EasyAudio 
 +from pymultilame import TextureChange 
 + 
 +from pymultilame import scene_change, droiteAffine, scene_change, print_str_args 
 +from pymultilame import get_all_objects, get_all_scenes, get_scene_with_name 
 + 
 + 
 +# Imports en python2 
 + 
 +from pymultilame.myconfig2 import MyConfig2 
 +from pymultilame.tcpclient2 import TcpClient2 
 +</code> 
 + 
 +==== Licence ==== 
 + 
 +Touls les scripts sont sous 
 + 
 +GNU GENERAL PUBLIC LICENSE Version 3 
 + 
 +voir le fichier LICENSE 
 + 
 +=====Documentation génèrée avec pydoc3.5===== 
 +Le script qui génère cette doc est dans le module pymultilame. 
 +====blendergetobject==== 
 +<code txt> 
 +FUNCTIONS 
 +    get_all_objects() 
 +        Trouve tous les objets des scènes actives 
 +        Retourne un dict {nom de l'objet: blender object} 
 +     
 +    get_all_scenes() 
 +        Récupération des scènes 
 +     
 +    get_scene_with_name(scn) 
 +        Récupération de la scène avec le nom 
 + 
 +</code> 
 + 
 +====blendersound==== 
 +<code txt> 
 +DESCRIPTION 
 +    Classe générique qui permet de gérer facilement le son 
 +    dans le Blender Game Engine BGE. 
 +     
 +    gl est le GameLogic, get with : from bge import logic as gl 
 +     
 +    Appel de cette classe où tous les sons sont dans une liste avec : 
 +        import aud 
 +     
 +        soundList = ["boum", ...] avec les fichiers boum.ogg etc... 
 +     
 +        Création de l'objet qui est un dictionnaire 
 +     
 +        gl.sound = EasyAudio(soundList) 
 +            soit { "boum": fabrique de boum.ogg, ....} 
 +        Joue le son boum 
 +            gl.sound["boum"].play() 
 +        Stop le son 
 +            gl.sound["boum"].stop() 
 +        Idem repeat, pause
  
-<file text docstring.txt> 
-====blendertools==== 
 CLASSES CLASSES
-    builtins.object +        Factory
-        VirtualGl+
          
-    class VirtualGl(builtins.object+    class EasyAudio(builtins.dict
-     |  bge = blender game engine +     |  Crée une usine pour chaque sondans un dict.
-      Cette class remplace +
-      from bge import logic +
-      en dehors du Game Engine. +
-      En faitne marche pas en dehors de Blender.+
      |        |  
-     |  Data descriptors defined here:+     |  Method resolution order: 
 +          EasyAudio 
 +          builtins.dict 
 +          builtins.object
      |        |  
-     |  __dict__ +     |  Methods defined here:
-          dictionary for instance variables (if defined)+
      |        |  
-     |  __weakref__ +     |  __init__(self, soundList, path, buffered=True) 
-          list of weak references to the object (if defined)+          soundList = ["boum", ...] 
 +          path example "//audio/comment/" 
 +     
 +    class Factory(builtins.object) 
 +      Class usine pour chaque son. 
 +       
 +      Methods defined here: 
 +       
 +      __init__(self, audio_file_path, buffered=True) 
 +          audio_file_path = "//audio/comment/boum.ogg" 
 +          buffered = Boolean 
 +       
 +      pause(self) 
 +          Pause 
 +       
 +      play(self, volume=1) 
 +          play the audio, this return a handle to control play/pause/stop 
 +       
 +      repeat(self, volume=1) 
 +          Repeat 
 +       
 +      set_pitch(self, pitch) 
 +          Hauteur 
 +       
 +      set_volume(self, vol) 
 +          Volume 
 +       
 +      stop(self) 
 +          Stop
  
 +</code>
 +
 +====blendertempo====
 +<code txt>
 +CLASSES
 +        TempoFactory
 +    
 +    class Tempo(builtins.dict)
 +      Création des tempos définies dans une liste de tuple:
 +          * tempo_liste = [("intro", 60), ("print", 12), ("sound", 6)]
 +      Chaque objet tempo:
 +          * tempoDict = Tempo(tempo_liste)
 +      Update des tempo à insérer dans un script qui tourne à chaque frame:
 +          * tempoDict.update()
 +      Appel d'une tempo:
 +          * tempoDict["intro"].tempo
 +      Voir exemple test() du __main__
 +     |  
 +      Method resolution order:
 +          Tempo
 +          builtins.dict
 +          builtins.object
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, tempoList)
 +          Initialize self.  See help(type(self)) for accurate signature.
 +     |  
 +      update(self)
 +          D.update([E, ]**F) -> None.  Update D from dict/iterable E and F.
 +          If E is present and has a .keys() method, then does:  for k in E: D[k] = E[k]
 +          If E is present and lacks a .keys() method, then does:  for k, v in E: D[k] = v
 +          In either case, this is followed by: for k in F:  D[k] = F[k]
 +     |  
 +         
 +    class TempoFactory(builtins.object)
 +      Les tempos sont en fait des compteurs qui sont mis à jour à chaque
 +      frames de Blender avec update.
 +      Pour une tempo de n, compte bien de 0 à n-1
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, periode=60)
 +          Paramètres:
 +          période: la tempo est remise à zéro si periode atteind, -1 = infinite loop
 +          pas: incrément de la tempo, par défaut=1, aucun intérêt de changer le pas
 +          verrou: si verrou, pas d'incrémentation.
 +     |  
 +      lock(self)
 +          Verrou, je bloque
 +     |  
 +      reset(self)
 +          Remise à zéro de la tempo
 +     |  
 +      unlock(self)
 +          Pas de verrou, je peux incrémenter
 +     |  
 +      update(self)
 +          J'incrémente si pas de verrou. Si verrou, je ne fais rien
 +
 +FUNCTIONS
 +    test()
 +        Tourne en dehors de Blender.
 +
 +</code>
 +
 +====blendertexture====
 +<code txt>
 +DESCRIPTION
 +    Class générique qui permet de changer la texture d'un objet.
 +    Ce script ne peut tourner que dans blender.
 +
 +CLASSES
 +    class TextureChange(builtins.object)
 +      Classe générique utilisable dans d'autres projects,
 +      pour changer une texture d'un objet.
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, obj, old_tex)
 +          obj     = objet concerné
 +          old_tex = image de la texture originale, ex "danseur2.png"
 +          new_tex = "//textures/perso.png"
 +     |  
 +      texture2old(self)
 +          Effacement de l'objet python, pour retourner à l'ancienne texture.
 +     |  
 +      texture_new(self, new_tex)
 +          Application de la nouvelle image de la texture.
 +          
 +          Répéter la fonction plusieurs fois (ex 5x) pour que
 +          le changement marche.
 +          Tous les object avec le matériau seront changés.
 +
 +</code>
 +
 +====blendertools====
 +<code txt>
 FUNCTIONS FUNCTIONS
     droiteAffine(x1, y1, x2, y2)     droiteAffine(x1, y1, x2, y2)
Ligne 62: Ligne 286:
         Scene must be str: if scene = scene python object, name is scene.name         Scene must be str: if scene = scene python object, name is scene.name
  
-DATA +</code>
-    gl = <blendertools.VirtualGl object> +
- +
-FILE +
-    /media/data/3D/projets/pymultilame/pymultilame/blendertools.py+
  
 +====blenderviewport====
 +<code txt>
 +FUNCTIONS
 +    disable_viewport(cam)
 +        Disable
 +    
 +    enable_full_viewport(cam)
 +        cam is blender object
 +    
 +    enable_half_viewport(cam1, cam2)
 +        cam1 and 2 are blender objects
 +    
 +    enable_quad_viewport(cam1, cam2, cam3, cam4)
 +        cam1 2 3 4 are blender objects
 +    
 +    enable_stereo_viewport(cam1, cam2)
 +        cam1 and 2 are blender objects
  
 +</code>
  
 ====fifolist==== ====fifolist====
 +<code txt>
 CLASSES CLASSES
-    builtins.object 
-        PileFIFO 
-     
     class PileFIFO(builtins.object)     class PileFIFO(builtins.object)
-      Pile FIFO pour faire statistiques sur dernières valeurs.+      Pile FIFO pour faire des statistiques 
 +     |  sur les dernières valeurs d'une variable.
      |        |  
       Methods defined here:       Methods defined here:
Ligne 92: Ligne 329:
           La dernière valeur est-elle cohérente par rapport aux précédentes ?           La dernière valeur est-elle cohérente par rapport aux précédentes ?
           à lancer après append et average_calcul           à lancer après append et average_calcul
 +
 +</code>
 +
 +====getmyip====
 +<code txt>
 +FUNCTIONS
 +    get_my_ip()
 +        Retourne l'adresse ip du pc sur le réseau local.
 +        Valable pour python 3.x
 +        Non valable sur android
 +
 +</code>
 +
 +====httpdownload====
 +<code txt>
 +DESCRIPTION
 +    Télécharge une url.
 +    Peut aussi l'enregister
 +
 +CLASSES
 +    class HttpDownload(builtins.object)
 +      Télécharge une url.
      |        |  
-      ---------------------------------------------------------------------- +     |  Retourne 
-     |  Data descriptors defined here:+          un string si text (html) 
 +          des bytes si fichier 
 +     |  Enregistre dans un fichier
      |        |  
-     |  __dict__ +     |  Usage: 
-          dictionary for instance variables (if defined)+          hd = HttpDownload(
 +          # recupère la réponse 
 +          resp = hd.get_response(url, timeout=2) 
 +          # ou enregistre           
 +          hd.save_response(u, timeout=2, name=name) 
 +          # ou les 2 
 +          resp = hd.save_response(u, timeout=2, name=name)
      |        |  
-     |  __weakref__ +     |  Methods defined here: 
-          list of weak references to the object (if defined)+       
 +      decode_or_not(self, response) 
 +          Decode utf-8 si text, rien si fichier. 
 +          Donc text = utf-8, fichier = bytes 
 +       
 +      get_response(self, someurl, timeout=2) 
 +          Retourne la réponse de la requête, decodée si str 
 +       
 +      request(self, someurl, timeout=2) 
 +          Télécharge une url. 
 +          Retourne des bytes: https://bit.ly/2wau8j1 ou string vide 
 +       
 +      save_response(self, someurl, timeout=2, name='toto'
 +          Enregistre la réponse de la requête à someurl, 
 +          dans un fichier name 
 +          Retourne aussi la réponse. 
 +          Si réponse None, ne fera rien, retourne None
  
-FILE +FUNCTIONS 
-    /media/data/3D/projets/pymultilame/pymultilame/fifolist.py+    save_data_in_file(data, fichier, mode) 
 +        Mode 'w' écrit un string dans le fichier 
 +        Mode 'wb' écrit des bytes dans le fichier 
 +        donc enregistre un fichier 
 +        w ecrase 
 +        a ajoute
  
 +</code>
  
 +====multicast====
 +<code txt>
 +CLASSES
 +    class Multicast(builtins.object)
 +      Récupère des datas en Multicast.
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, ip, port, buffer_size=1024)
 +          Initialize self.  See help(type(self)) for accurate signature.
 +     |  
 +      create_sock(self)
 +          Création d'un socket multicast self.sock.
 +     |  
 +      receive(self)
 +          Retourne les datas brutes reçue sur multicast.
 +     |  
 +      send_to(self, msg, addr)
 +          Envoi de msg à addr en multicast.
 +
 +</code>
 +
 +====myconfig====
 +<code txt>
 +DESCRIPTION
 +    Le fichier ini doit être défini avec son chemin absolu
 +    
 +    Pour un projet python:
 +        import os
 +        dossier = os.path.dirname(os.path.abspath(__file__))
 +        ou
 +        os.getcwd()
 +    
 +    Pour un projet Blender, le chemin complet est trouvé avec:
 +        bge.logic.expandPath()
 +
 +CLASSES
 +    class MyConfig(builtins.object)
 +      Charge la configuration depuis le fichier *.ini,
 +      sauve les changement de configuration,
 +      enregistre les changements par section, clé.
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, ini_file)
 +          Charge la config depuis un fichier *.ini
 +          Le cemin doit être donné avec son chemin absolu.
 +     |  
 +      load_config(self)
 +          Lit le fichier *.ini, et copie la config dans un dictionnaire.
 +     |  
 +      save_config(self, section, key, value)
 +          Sauvegarde dans le fichioer *.ini  avec section, key, value.
 +          Uniquement int, float, str
 +
 +</code>
 +
 +====myconfig2====
 +<code txt>
 +DESCRIPTION
 +    Le fichier ini doit être défini avec son chemin absolu
 +    
 +    Pour un projet python:
 +        import os
 +        dossier = os.path.dirname(os.path.abspath(__file__))
 +        ou
 +        os.getcwd()
 +    
 +    Pour un projet Blender, le chemin complet est trouvé avec:
 +        bge.logic.expandPath()
 +
 +CLASSES
 +      Uniquement python 2
 +      Charge la configuration depuis le fichier *.ini,
 +      sauve les changement de configuration,
 +      enregistre les changements par section, clé.
 +     |  
 +      Methods defined here:
 +     |  
 +      __init__(self, ini_file)
 +          Charge la config depuis un fichier *.ini
 +          Le cemin doit être donné avec son chemin absolu.
 +     |  
 +      load_config(self)
 +          Lit le fichier *.ini, et copie la config dans un dictionnaire.
 +     |  
 +      save_config(self, section, key, value)
 +          Sauvegarde dans le fichioer *.ini  avec section, key, value.
 +          Uniquement int, float, str
 +
 +</code>
  
 ====mytools==== ====mytools====
 +<code txt>
 DESCRIPTION DESCRIPTION
     Des méthodes souvent appelées par les autres scripts,     Des méthodes souvent appelées par les autres scripts,
Ligne 113: Ligne 494:
  
 CLASSES CLASSES
-    builtins.object 
-        MyTools 
-     
     class MyTools(builtins.object)     class MyTools(builtins.object)
       Methods defined here:       Methods defined here:
Ligne 136: Ligne 514:
           exemple:           exemple:
               "network/http_download.py"               "network/http_download.py"
 +     |  
 +      get_all_sub_directories(self, root)
 +          Retourne la liste de tous les sous-répertoires, et du répertoire,
 +          y compris les __pycache__
      |        |  
       get_json_file(self, fichier)       get_json_file(self, fichier)
Ligne 150: Ligne 532:
      |        |  
       run_command_system(self, command)       run_command_system(self, command)
-          Excécute la command shell et reourne la sortie terminal+          Excécute la command shell. 
-          command = ['your_command', 'arg1', 'arg2', ...] +          command = liste
-          Ne marche pas: +
-              resp = subprocess.call(command.split())+
      |        |  
-      write_data_in_file(self, data, fichier) +      write_data_in_file(self, data, fichier, mode
-          Ecrit des data de type string dans le fichier, écrase l'existant+          Ecrit data dans le fichier. 
-       +          Mode 'w' écrit un string dans le fichier 
-      ---------------------------------------------------------------------- +          Mode 'wb' écrit des bytes dans le fichier 
-      Data descriptors defined here: +          w écrase 
-       +          a ajoute
-      __dict__ +
-          dictionary for instance variables (if defined) +
-       +
-      __weakref__ +
-          list of weak references to the object (if defined)+
  
-DATA +</code>
-    __all__ = ['MyTools'+
- +
-FILE +
-    /media/data/3D/projets/pymultilame/pymultilame/mytools.py +
- +
- +
- +
-====http_download==== +
-DESCRIPTION +
-    Télécharge une url. +
-    Peut aussi l'enregister+
  
 +====tcpclient2====
 +<code txt>
 CLASSES CLASSES
-    builtins.object +      Uniquement python 2 
-        HttpDownload +     |  Envoi et réception sur le même socket en TCP.
-     +
-    class HttpDownload(builtins.object) +
-     |  Télécharge une url.+
      |        |  
-     |  Retourne +     |  Methods defined here:
-          - un string si text (html) +
-          - des bytes si fichier +
-      Enregistre dans un fichier+
      |        |  
-     |  Usage: +     |  __init__(selfipport)
-          hd = HttpDownload(+
-          # recupère la réponse +
-          resp = hd.get_response(url, timeout=2) +
-          # ou enregistre           +
-          hd.save_response(u, timeout=2, name=name) +
-          # ou les 2 +
-          resp = hd.save_response(utimeout=2name=name)+
      |        |  
-     |  Methods defined here:+     |  clear_buffer(self, buff) 
 +          N'a pas marché dans rezobox.
      |        |  
-     |  decode_or_not(self, response+     |  close_sock(self) 
-          Decode utf-8 si text, rien si fichier. +          Fermeture de la socket.
-          Donc text = utf-8, fichier = bytes+
      |        |  
-     |  get_response(self, someurl, timeout=2) +     |  connect_sock(self)
-          Retourne la réponse de la requête, decodée si str+
      |        |  
-     |  request(self, someurl, timeout=2+     |  create_socket(self) 
-          Télécharge une url+          Création du socket sans try, et avec connexion
-          Retourne des bytes: https://bit.ly/2wau8j1 ou string vide+          Reconnexion toutes les secondes 
 +          La différence entre python 2 et 3 est là
      |        |  
-     |  save_response(self, someurl, timeout=2, name='toto') +     |  listen(self, buff
-          Enregistre la réponse de la requête à someurl, +          Retourne les data brutes reçueset vide le buffer TCP
-          dans un fichier name +
-          Retourne aussi la réponse. +
-          Si réponse None, ne fera rienretourne None+
      |        |  
-     |  ---------------------------------------------------------------------- +     |  re_connect_sock(self)
-      Data descriptors defined here:+
      |        |  
-     |  __dict__ +     |  reconnect(self) 
-          dictionary for instance variables (if defined)+          Reconnexion.
      |        |  
-     |  __weakref__ +     |  send(self, msg) 
-          list of weak references to the object (if defined)+          Envoi d'un message, avec send, msg doit être encodé avant.
  
-FUNCTIONS +</code>
-    save_data_in_file(data, fichier, mode) +
-        Mode 'w' écrit un string dans le fichier +
-        Mode 'wb' écrit des bytes dans le fichier +
-        donc enregistre un fichier +
-        w ecrase +
-        a ajoute+
  
-DATA +====tcpclient3==== 
-    __all__ ['HttpDownload', 'save_data_in_file'+<code txt>
- +
-FILE +
-    /media/data/3D/projets/pymultilame/pymultilame/http_download.py +
- +
- +
- +
-====tcpclient====+
 CLASSES CLASSES
-    builtins.object +    class TcpClient3(builtins.object) 
-        TcpClient +      Uniquement python 3
-     +
-    class TcpClient(builtins.object)+
       Envoi et réception sur le même socket en TCP.       Envoi et réception sur le même socket en TCP.
      |        |  
Ligne 257: Ligne 591:
       __init__(self, ip, port)       __init__(self, ip, port)
           Initialize self.  See help(type(self)) for accurate signature.           Initialize self.  See help(type(self)) for accurate signature.
 +     |  
 +      clear_buffer(self, buff)
      |        |  
       close_sock(self)       close_sock(self)
Ligne 262: Ligne 598:
      |        |  
       connect_sock(self)       connect_sock(self)
-          Connexion de la socket, si ok retoune 1 sinon None 
      |        |  
       create_socket(self)       create_socket(self)
           Création du socket sans try, et avec connexion.           Création du socket sans try, et avec connexion.
      |        |  
-      listen(self) +      listen(self, buff
-          Retourne les data brutes reçues.+          Retourne les data brutes reçues, et vide le buffer TCP 
 +       
 +      re_connect_sock(self)
      |        |  
       reconnect(self)       reconnect(self)
Ligne 275: Ligne 612:
       send(self, msg)       send(self, msg)
           Envoi d'un message, avec send, msg doit être encodé avant.           Envoi d'un message, avec send, msg doit être encodé avant.
 +
 +</code>
 +
 +====udpclient====
 +<code txt>
 +DESCRIPTION
 +    Recréer un socket avant chaque envoi ou réception, résoud les problèmes
 +    de réseau, ça se reconnecte tout seul.
 +    Par contre, le port éphémère du recvfrom changera à chaque fois.
 +
 +CLASSES
 +    class UdpClient(builtins.object)
 +      Envoi et reception en UDP.
 +      Cette classe n'encode pas le message à envoyer.
      |        |  
-     |  ---------------------------------------------------------------------- +     |  Methods defined here:
-      Data descriptors defined here:+
      |        |  
-     |  __dict__ +     |  __init__(self, buffer_size=1024, timeout=0.01) 
-          dictionary for instance variables (if defined)+          Création d'un socket UDP. 
 +          buffer_size = entier, permet de vider le buffer à chaque lecture, 
 +          pour avoir toujours la dernière valeur.
      |        |  
-     |  __weakref__ +     |  bind(self, addr) 
-          list of weak references to the object (if defined)+          Quelle est la différence avec connect ? 
 +       
 +      close(self) 
 +       
 +      connect(self, addr) 
 +          Connexion à l'adresse pour recevoir addr = tuple. 
 +       
 +      listen(self) 
 +          Retourne les datas et l'adresse reçue. 
 +       
 +      send_to(self, req, address) 
 +          Envoi à l'adresse = (ip, port). 
 + 
 +</code>
  
-FUNCTIONS 
-    sleep(...) 
-        sleep(seconds) 
-         
-        Delay execution for a given number of seconds.  The argument may be 
-        a floating point number for subsecond precision. 
  
-FILE +{{tag>python sb realisations_logicielles}}
-    /media/data/3D/projets/pymultilame/pymultilame/tcpclient.py +
-</file> +
-         +
-{{tag>python sb}}+