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

Bibliothèques tierces Python Discussion :

Transformer un jeu de scripts en module [Python 3.X]


Sujet :

Bibliothèques tierces Python

  1. #1
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut Transformer un jeu de scripts en module
    Hello,

    depuis quelques jours je bloque sur la mise d'une petite appli en module. Par module je veux dire un dossier que l'on peut poser dans site-packages et utiliser en faisant un import appli.

    Le problème est que ce n'est pas un simple script, mais un lot de 3 scripts qui s'appellent les uns les autres. J'ai bien sûr googlé et chatGPTé mais j'avoue que je n'ai pas compris grand chose... Quand l'import marche dans le fichier __init__, il ne marche pas dans l'appli et du coup il ne marche pas non plus dans un script externe qui voudrait utiliser l'appli.

    J'ai fait un jeu de fichiers minimaliste pour décrire mon problème. Si quelqu'un peut m'orienter vers une façon de faire qui garderait mes 3 scripts ensemble sans les dispatcher dans de différents répertoires... j'ai joint un zip avec le jeu de fichiers pour reproduire le problème.

    site-packages/lib/__init__.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import lib
    import tools
    import constants
    site-packages/lib/src/lib.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from lib.src import tools
    from lib.src import constants
    def addDouble(value):
        return value + mul2(value)
    site-packages/lib/src/tools.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from lib.src.constants import *
    def mul2(value):
        return B * value
    site-packages/lib/src/constants.py
    pour les appeler de façon "conventionnelle" avec le nom du module en préfixe,
    quelque_par_sur_le_disque/dummy2.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import lib
    if __name__ == "__main__":
        print(lib.addDouble(33))  # to test lib.py
        print(lib.mul2(3)) # to test tools.py
        print(lib.A) # to test constants.py
    j'ai l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "/home/pfeuh/Documents/sources/python/test/dummy2.py", line 1, in <module>
        import lib
      File "/home/pfeuh/.local/lib/python3.10/site-packages/lib/__init__.py", line 2, in <module>
        import tools
    ModuleNotFoundError: No module named 'tools'
    et pour finir si je ne veux par exemple que les constantes,
    quelque_par_sur_le_disque/dummy.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from lib.constants import *
    print(A) # to test constants.py
    j'ai l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "/home/pfeuh/Documents/sources/python/test/dummy.py", line 1, in <module>
        from lib.constants import *
      File "/home/pfeuh/.local/lib/python3.10/site-packages/lib/__init__.py", line 2, in <module>
        import tools
    ModuleNotFoundError: No module named 'tools'
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 514
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 514
    Points : 37 131
    Points
    37 131
    Par défaut
    Salut,

    Quand on écrit import lib, ça va marcher si le module lib est accessible depuis la racine (donnée par l'emplacement du main et de ce qu'on va trouver dans sys.path).
    Si dans lib, les modules sont dans le répertoire src, il va falloir écrire import lib.src.tools,...

    A quoi sert "src" la dedans?
    Une autre option est d'utiliser dans les modules de lib des import relatifs.

    note: vous avez un chapitre sur le sujet dans le tutoriel qui vient avec Python.

    - W

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Quand tu dis que ça marche, il faut nuancer un petit peu. En fait ça ne marche que si lib.py n'a pas de dépendance, mais comme il a tools.py et constants.py, je tourne en rond.

    En dehors de site-packages, quand tous les fichiers sont dans le même répertoire que le script qui a besoin d'importer (ici dummy1.py et dummy2.py), ça marche. Mais quelque chose que l'on doit copier-coller a chaque endroit où on en a besoin, ça n'a pas d'intérêt

    Du coup je déplace le répertoire qui contient le tout vers dans site packages, ça continue de marcher. Puis je rajoute le __init__.py vide et je déplace les scripts qui ont besoin d'importer à l'extérieur de site-packages et là ça ne marche plus.

    Le répertoire src ne sert effectivement à rien dans ce cas précis, ça fait partie d'une de mes nombreuses tentatives de faire fonctionner le truc.

    pour le répertoire qui vient avec python, parles-tu de celui là? https://docs.python.org/3/tutorial/modules.html je l'ai lu plusieurs fois et je n'ai rien compris, ça dépasse mes compétences. Bon, j'y retourne.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 245
    Points : 4 742
    Points
    4 742
    Par défaut
    bonjour
    Citation Envoyé par pfeuh Voir le message
    je déplace le répertoire qui contient le tout vers dans site packages
    Tu devrais faire l'inverse:
    1) créer tes répertoires à la racine de ton projet
    2) une fois qu'il fonctionne alors on pense à en faire un module (le déplacer)


    ------------
    Ici, tout est confus :
    - ton répertoire /src/, bravo il n'y a pas mieux pour tout compliquer (mais si tu aimes les défis ok)
    - module se nomme "lib" et à l'intérieur nous avons encore "lib" (tu fais toi même cette erreur dans ton __init__ à la première ligne )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #import lib   Certainement PAS !
    import lib.src.lib as utils
    import lib.src.tools as tools
    import lib.src.constants as constants
    et dans le programme test, on peut écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import lib
    if __name__ == "__main__":
        print(lib.utils.addDouble(33))  # to test lib.py
        print(lib.tools.mul2(3)) # to test tools.py
        print(lib.constants.A) # to test constants.py
     
    # ou bien:
    from lib import utils, tools, constants
    if __name__ == "__main__":
        print(utils.addDouble(33))  # to test lib.py
        print(tools.mul2(3)) # to test tools.py
        print(constants.A) # to test constants.py
    et tools.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import lib.src.constants as constantes
    def mul2(value):
        return constantes.B * value
    ou autrement, dans lib.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from . import tools
    from . import constants
    def addDouble(value):
        return value + tools.mul2(value)
    ---------------
    Ici, tout est confus car il faut déjà penser à une api puis faire l'architecture en fonction de cette api
    Mon code, ici reste confus puisque je n'ai aucune idée de l'api désirée
    Ici, le fichier optionnel __init__.py n'est utile que pour shunter /src/ et éviter les 2 "lib" imbriqués

    Par module je veux dire un dossier que l'on peut poser dans site-packages et utiliser en faisant un import appli.
    Le seul intérêt de déplacer cette arborescence hors du projet, c'est d'avoir plusieurs applications python qui vont l'utiliser.

  5. #5
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Merci, ça devient plus clair, je commence à voir le bout du tunnel.

    En fait ce n'est pas pour une appli précise, j'en ai plusieurs à partager, mais par exemple j'ai un package avec un lecteur de midifile (on peut lire, bidouiller puis sauver, ou créer à partir de zéro), un convertisseur de midifile vers des tables de fréquences (pour du rétro-computing), un convertisseur de table de fréquences vers midifile, des générateurs de code pour transformer les tables en python, C, assembleur etc...

    l'essentiel du module tourne autour du midifile et des quelques outils évoqués plus haut... Ainsi qu'un gros paquet de constantes midi qui trouve son utilité u peu partout.

    Il ne reste plus qu'à trouver un nom au module en évitant midifile, bien sûr, il y en a dejà des tonnes sur github.

    Citation Envoyé par papajoker Voir le message
    Le seul intérêt de déplacer cette arborescence hors du projet, c'est d'avoir plusieurs applications python qui vont l'utiliser.
    Oui, c'est exactement mon but.

  6. #6
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Points : 1 351
    Points
    1 351
    Par défaut
    Bon, ben encore merci, les gars, ça marche super bien. Ça valait le coup de poser la question!

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

Discussions similaires

  1. script perl (module telnet)
    Par oulai dans le forum Langage
    Réponses: 1
    Dernier message: 21/01/2011, 09h57
  2. Réponses: 4
    Dernier message: 23/11/2010, 15h26
  3. faire un uptime d'un serveur jeu en script bash
    Par kazylax dans le forum Linux
    Réponses: 0
    Dernier message: 04/08/2009, 18h02
  4. Script avec module telnet
    Par parisien91 dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 18/01/2009, 13h40
  5. tests des scripts, quels modules utiliser?
    Par Jasmine80 dans le forum Bioinformatique
    Réponses: 5
    Dernier message: 11/06/2007, 19h13

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