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 :

confusion: je n'importe pas des modules dans un script et ca marche, pourquoi?


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2022
    Messages : 36
    Points : 35
    Points
    35
    Par défaut confusion: je n'importe pas des modules dans un script et ca marche, pourquoi?
    Bonjour
    J'ai un script python où je fais une requete SQL ver sune base avec duckdb.
    voici mon code main.py :

    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
    import duckdb
    import pandas as pd
    import utils.func
     
    con = duckdb.connect(database="db.duckdb", read_only=False)
     
    data = {
        "id": ["1","2","3","4","5","6",],
        "group": ["A","A","A","B","B","B",],
        "names": ["aze","www","ttt","xxxxxx","llllll","ggggggg",],
    }
     
    data_df = pd.DataFrame(data)
    con.execute("CREATE TABLE IF NOT EXISTS data AS SELECT * FROM data_df")
     
    my_query="select * from data"
     
    res = utils.func.query(con, my_query)
    print(res)
    j'ai donc une fonction pour executer ma requete.
    cette fonction prend 2 arguments: ma connexion à la db et la requete.

    cette fonction est ecrtie dans un autre script qui s'appelle func.py.

    voici func.oy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def query(DB_connection, query):
        print('appel')
        result=DB_connection.execute(query).df()
        return result
    je n'importe pas duckdb ou pandas dans ce script func.py.
    pourtant, dans cette fonction je fais appel aux methodes execute() de duckcb ou df() de pandas.

    je lance le script main.py et ca marche bien. Je comprends pas, je pensais que ca allait planter car func.py n'est pas supposé connaitre les methiodes execute() et df() non?

    pourquoi ca marche?
    ca veut dire que je n'ai besoin d'importer les modules que dans le main?

    merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Citation Envoyé par sqlbeginner Voir le message
    ca veut dire que je n'ai besoin d'importer les modules que dans le main?
    Non.

    Citation Envoyé par sqlbeginner Voir le message
    pourquoi ca marche?
    Chez-moi ça marche pas.
    J'ai pourtant reproduit tes codes à l'identique...

    1) un fichier "main.py"
    Code python : 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
    #!/usr/bin/env python3
    # coding: utf-8
     
    import duckdb
    import pandas as pd
    import utils.func
     
    con = duckdb.connect(database="db.duckdb", read_only=False)
     
    data = {
        "id": ["1","2","3","4","5","6",],
        "group": ["A","A","A","B","B","B",],
        "names": ["aze","www","ttt","xxxxxx","llllll","ggggggg",],
    }
     
    data_df = pd.DataFrame(data)
    con.execute("CREATE TABLE IF NOT EXISTS data AS SELECT * FROM data_df")
     
    my_query="select * from data"
     
    res = utils.func.query(con, my_query)
    print(res)

    2) un fichier "func.py" créé dans un sous-dossier "utils"...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env python3
    # coding: utf-8
     
     
    def query(DB_connection:duckdb.DuckDBPyConnection, query):
        print('appel')
        result=DB_connection.execute(query).df()
        return result
    A l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
      File "/tmp/main.py", line 5, in <module>
        import utils.func
      File "/tmp/utils/func.py", line 5, in <module>
        def query(DB_connection:duckdb.DuckDBPyConnection, query):
    NameError: name 'duckdb' is not defined
    En rajoutant import duckdb dans le fichier "utils/func.py"...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ python3 main.py 
    appel
      id group    names
    0  1     A      aze
    1  2     A      www
    2  3     A      ttt
    3  4     B   xxxxxx
    4  5     B   llllll
    5  6     B  ggggggg
    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]

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2022
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Juin 2022
    Messages : 36
    Points : 35
    Points
    35
    Par défaut
    EDIT:
    déoslé, j'ia corrigé la function dans func. py
    dans les arguments, je ne donne pas le type de DB_connection

    Quand on ne donne pas le type, ca fonctionne c'est ca?

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 104
    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 104
    Points : 4 454
    Points
    4 454
    Par défaut
    Petit exemple plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import pandas as pd
    import test2
     
    data = {
        "id": ["1","2","3","4","5","6",],
        "group": ["A","A","A","B","B","B",],
        "names": ["aze","www","ttt","xxxxxx","llllll","ggggggg",],
    }
     
    data_df = pd.DataFrame(data)
    test2.faire(data_df)
    fichier test2.py (complet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def faire(x):
        print(x.size)    # passe si dataframe ?
        x.show()   # force un plantage (affiche type)
    Au plantage (voulu), l'objet est bien interprété par python
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    18
    Traceback (most recent call last):
      File "/home/patrick-m/test.py", line 15, in <module>
        test2.faire(data_df)
      File "/home/patrick-m/test2.py", line 4, in faire
        x.show()
        ^^^^^^
      File "/home/patrick-m/.local/lib/python3.11/site-packages/pandas/core/generic.py", line 6204, in __getattr__
        return object.__getattribute__(self, name)
    $moi= ( !== ) ? : ;

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sqlbeginner Voir le message
    Quand on ne donne pas le type, ca fonctionne c'est ca?
    Ah ben oui là ce n'est plus pareil. Dans le script "func.py" il n'y a plus aucune référence à duckdb, ce module n'a donc pas besoin d'être importé. Tout est donc parfaitement cohérent.
    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]

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par sqlbeginner Voir le message
    pourquoi ca marche?
    ca veut dire que je n'ai besoin d'importer les modules que dans le main?
    On a besoin des imports pour pouvoir accéder aux objets class et fonctions qui permettront de créer des objets instances. Une fois ces instances créées, on peut accéder à leurs attributs normalement (comme .execute).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/06/2012, 13h00
  2. distinct .. y a t il pas des doublons dans mabase ?
    Par zin_rbt dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/03/2010, 20h27
  3. Importer/Exporter des articles dans un site wiki!
    Par OminiuS dans le forum SharePoint
    Réponses: 0
    Dernier message: 27/12/2007, 14h07
  4. [MEX] Comment appeler des modules dans un projet
    Par fatenov dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/11/2007, 22h58
  5. Réponses: 1
    Dernier message: 20/09/2006, 19h51

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