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

Déploiement/Installation Python Discussion :

cx_Freeze - Gestion arborescence


Sujet :

Déploiement/Installation Python

  1. #1
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut cx_Freeze - Gestion arborescence
    Bonjour tout le monde.


    J'ai développé dans le cadre de mon boulot un petit soft. Je suis en ce moment en phase de tests avant validation et je m'intéresse également à sa portabilité. En ce moment il tourne uniquement sur un PC muni de l'interpréteur Python et des quelques librairies utilisées. Je bosse pas du tout dans l'informatique et les gens qui seront ammenés à l'utiliser ne connaitront même pas le nom de "Python".

    Bref je veux en faire un exécutable. Je développe ce truc pour partie au bureau (W7) et sur mon temps libre (Linux). Je me suis donc orienté vers cx_freeze (même setup.py sur les deux machines).

    J'ai lu l'excellent petit tuto de Tyrtamos (merci à lui ). Je suis capable de créer un exécutable avec un script bidon contenant:
    1. plusieurs modules créés par moi-même [includes]
    2. une référence à un fichier de données [includes_files]
    3. une interface bidon en tkinter


    J'ai là l'essentiel des choses qui m'intéressent. Mon problème c'est que je ne trouve rien sur la gestion des arborescence sur internet. Je vais essayer d'expliquer simplement ce que je souhaite :

    Mon programme utilise deux répertoires au même "niveau" dans l'arborescence, l'un dans lequel des log files sont créés, et l'autre contenant des données. C'est surtout ce dernier qui me pose un soucis car son contenu n'est pas connu d'avance. Un certain nombre de sous-dossier sont créés par l'utilsateur chacun contenant quatre fichiers. Ces sous-dossiers définissent des objets dans mon code. Voici un sketch simple:


    root
    >>module1.py
    >>module2.py
    >>main.py
    >>LogFiles
    >>Objects
    >>>Object1
    >>>>data1.dat
    >>>>data1.dat
    >>>Object2
    >>>>data1.dat
    >>>>data1.dat

    Les noms des objets est laissé au bon soin de l'utilisateur. Cette architecture me semble être simple pour l'utilisateur (ce que je trouve bien ne l'est pas forcément pour tout le monde cela dit).

    Est-ce que vous auriez une idée de comment gérer cela? Je n'y parviens pas, ni avec includes, ni avec includes_files ni avec le sys.path (cela dit c'est peut-être moi qui merde).

    Je peux si nécessaire copier mon setup.py mais pas avant ce soir après le boulot (oui je sais c'est pas bien de venir ici au lieu de bosser

    Merci!


    PS: J'utilise python 2.7, linux et windows

    Ju

  2. #2
    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,

    Je ne suis pas sûr d'avoir compris ce que tu cherches, mais je peux au moins dire comment je fais.

    Tout le programme à convertir se trouve dans un répertoire.

    Dans ce répertoire, à sa racine, on trouve le programme principal à convertir en .exe avec ses modules .py à importer directement. On peut signaler ces modules par l'option "includes" si cx_freeze ne les trouve pas tout seul.

    Dans ce répertoire, tous les sous répertoires contenant des modules à importer sont convertis en packages (avec des "__init__" éventuellement vides), gérés comme des packages dans les scripts Python (syntaxe d'importation), et signalés dans le setup.py par l'option "packages", si cx_freeze ne les trouve pas tout seul.

    Dans ce répertoire, on peut trouver n'importe où dans l'arborescence des données fixes, nécessaires au fonctionnement du programme: on les signale par includefiles pour qu'ils soient recopiés au bon endroit. Par exemple: un fichier icône, un répertoire d'aide, des fichiers images, des fichiers de configuration, des documents pdf, etc... Cela peut même être le cas pour des packages qui ont besoin de tels fichiers de données pour fonctionner!


    Mais les emplacements dans lesquels le programme devra modifier les données NE SONT PAS dans cette arborescence: pour des problèmes de sécurité (Windows-Linux-MacOSX), les programmes "binaires" n'écrivent JAMAIS à l'endroit où ils sont installés!

    Il faut donc donner au programme un endroit pour écrire, c'est à dire un endroit dans lequel l'utilisateur qui a lancé le programme aura le droit d'écrire!
    On peut:

    - lui donner un répertoire lors de l'intallation

    - lui donner un répertoire au lancement, récupérable par sys.argv

    - faire en sorte que le programme demande un répertoire de travail à l'utilisateur

    - faire qu'il trouve lui-même le répertoire "home" de l'utilisateur par: os.path.expanduser("~"), ce qui est multiplateforme. Une fois trouvé, il crée un sous-répertoire spécifique au programme, par exemple ".monprogramme", dans lequel il fera tout ce qu'il voudra, et il pourra même retrouver les infos dans les sessions suivantes. Cela permet en plus à plusieurs utilisateurs du PC d'utiliser le même programme avec des données personnalisées. De nombreux programmes font ça: ".scribus", ".Virtualbox", etc...


    Enfin, ce que fait cx_freeze est compliqué: il est inévitable de tâtonner en fonction des messages d'erreur ou d'alerte donnés lors du traitement ou des premières exécutions de l'exe créé. D'où l'intérêt d'utiliser la console au début. On peut alors améliorer le setup.py, et même quelquefois le script du programme et de ses modules.

    Si ça ne répond pas à ta question: précise-la!
    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

  3. #3
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut Tyrtamos.

    Merci beaucoup pour toutes ces précisions. C'est bien plus clair dans mon esprit à présent. Je vois que j'ai fait quelques erreurs de conceptions (rien de bien méchant cela dit).

    Dans le cas qui me préocupe l'outil developpé est vraiment très simple et ne nécessite pas de paquets. J'envisageais une application standalone. De plus, n'ayant pas besoin de sauvegardes de paramètres, travaux, etc.. je ne vais pas m'orienter vers la création d'un répertoire de travail. Je garde quand même cela en tête, ça pourra peut-être me servir par la suite (et c'est propre comme méthode).

    Mon seul soucis c'est que j'envisageais de laisser la possibilité à un utilisateur de modifier les données du *logiciel*. J'abandonne, ce n'est pas propre du tout.

    Pour préciser un peu plus le sujet, mon programme doit permettre l'importation des caractéristiques d'un objet (un navire pour être exact) depuis des fichiers textes. En plus de ces données, l'utilistateur rentre des inputs via une interface (entry box essentiellement) et lance un calcul. Le resulat s'affiche sous la forme d'un graph dans l'interface. L'utilisateur peut alors sauvegarder ce graph en tant qu'image là où il le souhaite.

    Les données sont donc de deux natures: fichiers textes et inputs. Ce choix est motivé par la quantité d'informations présentes dans les fichiers textes (qui ne changent pas d'une utilisation du logiciel à l'autre).

    Pour le moment j'ai quelques objets de définis. Mais par la suite d'autres devraient pouvoir l'être (et importable) sans pour autant avoir à recréer un exécutable. C'est là que je coince. En somme comment permettre à l'utilisateur d'ajouter des éléments à la librairie d'objet tout en restant portable (sans installation)?

    Si quelqu'un à une idée je suis prenneur.


    Ju

  4. #4
    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,

    Juste quelques idées.

    Si on veut garder trace d'ajouts de fichiers et de saisies manuelles, on peut par exemple:

    1- recopier les fichiers dans un même répertoire (module shutil). Sous Python, il sera facile ensuite de retrouver tous les fichiers de ce répertoire pour les relire.

    2- conserver les données saisies dans un fichier "ini" (module ConfigParser), ca qui permet d'intervenir sur ces données en dehors du programme avec un simple éditeur de texte, ou dans une base de données sqlite, ou en sauvegardant un dictionnaire avec shelve. On peut imaginer d'autres solutions (marshal, pickle, ...), et cela dépendrait aussi du type de données à conserver.

    Dans ces différentes solutions, on peut conserver en même temps le nom du fichier et les données saisies relatives à ce fichier ainsi que la date de l'ajout, afin de pouvoir synchroniser ces 2 types d'information.
    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

  5. #5
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Bonjour,

    Merci Tyrtamos pour ces idées. J'ai commencé à me renseigner à leur propos.

    Je pas beaucoup avancé dans le déploiement de mon programme. J'ai pris du temps pour corriger des passages de mon code, simplifier certaines choses, regrouper de fonctions... Bref, gros nettoyage de printemps !

    De plus je suis confronté à deux problèmes distincts avec cx_Freeze qui m'empêchent pour le moment d'avancer:
    1. Lors du build les dossiers à inclure ne sont pas copiés
    2. J'ai un problème avec un fichier provenant de matplotlib


    Tout d'abord je souhaite copier un dossier nommé "data" se trouvant à la racine de programme. Pour cela j'ai modifié la variable path dans le setup.py comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    path = sys.path.append(str(os.getcwd())+'/data')
    Le build se déroule alors sans message d'erreur, mais le dossier en question n'est pas copié. Si après coup je le fait à la main mon programme se lance sans encombre (programme test)...

    Pour ce qui est du deuxième point, plus problématique, j'ai besoin de copier les dépendances de matplotlib. Lors du build, j'ai le message d'erreur suivant:

    error: /usr/lib/pymodules/python2.7/matplotlib/mpl-data: No such file or directory
    En fouillant sur internet j'ai rien de vu de concluant.

    La version de cx_Freeze que j'utilise: V.4.3.1 (installé depuis les sources sur ubuntu 12.04).
    La version de matplotlib : 1.1.1rc

    EDIT:

    J'ai continué à fouillé sur le deuxième point. Il s'avère que le message d'erreur est tout à fait légitime car aucun dossier nommé 'mpl-data' ne se trouve dans '/usr/lib/pymodules/python2.7/matplotlib/'. Ce dossier contenant entre autre les fonts, icônes... est installé chez moi dans '/usr/share/matplotlib/'.

    J'ai copié manuellement ce dossier avec tous ses fichiers, lien symboliques compris, dans '/usr/lib/pymodules/python2.7/matplotlib/' et désormais je n'ai plus de message d'erreur au moment du build. Cependant l'exécutable créé ne se lance pas pour autant.

    A creuser. Je vais faire une tentative sur mon PC au bureau, faut juste que j'installe cx_Freeze par le système IT et c'est pas gagné...



    Ju

  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,

    path ne recopie rien: il s'agit seulement des chemins de recherche des modules.

    En principe, les modules à importer sont recopiés automatiquement, et s'ils ne le sont pas, il suffit de les signaler par l'option "includes" (ou "packages"). Mais il s'agit seulement des modules (.py), et pas des autres fichiers. Pour ceux-ci, il faut demander la recopie avec "includefiles".

    Voilà comment fonctionne cette option:

    - recopie d'un fichier de la racine source à la racine destination:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    includefiles = ["monicone.png"]
    - recopie d'un répertoire, mais à une profondeur différente de l'arborescence: il faut mettre les chemins, absolu pour le source, et relatif pour la destination:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    includefiles = [("/usr/lib/qt4/plugins","plugins")]
    Pour l'ajout de bibliothèques sous Linux, il est quelquefois nécessaire de les ajouter avec l'option "binpathincludes". Mais il faut vérifier que ta version de cx_freeze soit suffisamment récente pour ça: cette option est arrivée il y a peu. A défaut, il te faudra désinstaller ton paquet cx_freeze, charger les sources à partir du site web, et les compiler pour avoir la dernière version: ce n'est pas très compliqué à faire, et je peux t'en dire plus si tu as le problème.
    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 éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Il me semble avoir la dernière version disponible pour linux, à savoir la V4.3.1. Je n'ai pas conservé celle proposée via les paquets.

    Visiblement j'ai confondu plusieurs choses dans mon setup. j'ai mal compris le fonctionnement du includefiles. Cependant il me semble qu'il accept uniquement une liste de tuples de dimmension 2. ça ne pose pas de problème de faire juste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    includefiles = ['monIcon.png']
    ça ne coûte rien d'essayer de toute façon! Je ferais ce soir.

    Pour revenir à matplotlib, si d'aventure mon programme ne se lance toujours pas (j'ai idée que le includefiles me génère un problème que je n'ai pas vu jusqu'ici), je vais me lancer dans la copie de binaires.

    Je sens que je touche au but.

    Merci infiniment,

    Ju

  8. #8
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    J'ai fait quelques essais hier soir. L'option "includefiles" fonctionne parfaitement comme indiqué dans ton post Tyrtamos. Je croyais cette option réservée uniquement aux fichiers seuls...

    Désormais, mon setup tourne sans soucis apparent, mon dossier de données se copie là où je le souhaite, mes fichiers égalements et les données de matplotlib aussi (mpl-data).

    L'éxécutable ainsi créé ne se lance pas pour autant. Mais j'ai isolé le problème à matplotlib en faisant des essais sur un programme simple. Le build de ce dernier fonctionne à merveille sauf lorsque j'ajoute l'importation du module matplotlib.

    Je vais creuser sur internet, je dois pas être le premier à recontrer cette difficulté. Je reviendrais donner le résutlat de mes recherches ici.


    Ju

  9. #9
    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,

    Dans google, avec les mots: "matplotlib cx_freeze setup" => il y a un exemple chez nullege.
    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

  10. #10
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Merci pour le lien, mais je l'avais moi aussi trouvé

    Mon setup est le suivant:

    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
    # -*- coding: utf-8 -*-
     
    """
        Module to freeze CP-Solver program with cx-Freeze V 4.3.1
        Date:   10-04-2013
    """
     
    #-----------------------------------------------------------------------
    #                   MODULE IMPORTATION
    #-----------------------------------------------------------------------
     
    try:
        import sys, os
        import matplotlib
        from cx_Freeze import setup, Executable
     
    except ImportError as exc:
        sys.stderr.write("Error: failed to import settings module ({})\n".format(exc))
        raw_input('Press any key to quit')
        sys.exit()
     
    #-----------------------------------------------------------------------
    #                PREPARATION OF THE OPTIONS
    #-----------------------------------------------------------------------
     
    path = sys.path
     
    includes = ['CPSolver','PolarPlot','EnvLoad']
    excludes = []
    packages = []
    includefiles = [(matplotlib.get_data_path(),'mpl-data'), # Matplotlib data
                    (os.getcwd()+'/Vessels','Vessels'),      # Vessel library
                    'Logo.gif']                              # Logo
     
    options = {"path": path,
               "includes": includes,
               "excludes": excludes,
               "packages": packages,
               "include_files": includefiles
               }
     
    #-----------------------------------------------------------------------
    #                       TARGET
    #-----------------------------------------------------------------------
     
    base = None
    if sys.platform == "win32":
        base = "Win32GUI"
     
    cible = Executable(
        script = "CPSolverGUI.py",
        base = base,
        compress = True,
        icon = None,
        )
     
    #-----------------------------------------------------------------------
    #                       SETUP
    #-----------------------------------------------------------------------
     
    setup(
        name = "CP-Solver",
        version = "0.1",
        description = "First test",
        author = "*****",
        options = {"build_exe": options},
        executables = [cible]
        )
    Il n'est pas foncièrement différent de l'exemple fourni pas nullege.


    Ju

  11. #11
    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
    Que souhaites-tu que je fasse pour t'aider?
    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

  12. #12
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Tu m'as déjà bien aidé à comprendre les différents aspects du setup. Et c'est beaucoup. Sans plus d'infos de ma part je ne vois pas ce que tu pourrais faire de plus malheureusement

    Je vais m'arranger d'une façon ou d'une autre pour pouvoir faire un essai sur une machine Windows. L'objectif étant finalement de déployer mon programme sur ces dernières. Peut-être que les résultats seront meilleurs.

    Je ne marque pas en résolu parce que j'espère trouvé ce que je fais de mal.


    Ju

  13. #13
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Eh bien le problème est "résolu".

    Je dis ça entre guillemets parce que le build est un succès sur mon PC de bureau (W7) mais pas sur ma machine perso (Ubuntu 12.04), et ce avec le même setup.py, même version des modules, même programme..

    L'essentiel est là, mais il va falloir que je cherche ce qui ne vas pas chez moi..

    Merci encore Tyrtamos!


    Ju

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

Discussions similaires

  1. arborescence et gestion des fichiers
    Par emayen01 dans le forum SharePoint
    Réponses: 2
    Dernier message: 17/07/2008, 16h49
  2. Gestion d'une nomenclature et arborescence
    Par ken_1234 dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/04/2008, 22h56
  3. Gestion d'arborescence intervallaire
    Par booth dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2006, 15h25
  4. Gestion de l'arborescence sur un serveur distant
    Par Seth77 dans le forum Langage
    Réponses: 5
    Dernier message: 13/03/2006, 17h30
  5. [pl/pgsql] pb gestion d'arborescence
    Par Sakalam dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 08/02/2006, 15h08

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