logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 02-10-2024 19:03:22

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

[Python 3] Importer correctement ses modules personnels [Résolu]

Hello,

Je débute dans Python.
Je comprends l'intérêt des imports (un peu comme C)
J'ai vite vu aussi l'intérêt d'avoir ses propres modules (répertoire + __init__.py + fichiers modules)
Et j'ai donc créé mon propre module ne comportant que des définitions de fonctions.

Or certaines de ces fonctions (dans le module perso) ont besoin d'import (re par exemple).
Bon, j'ai compris qu'en mettant l'import dans le fichier module et en important ce module dans un script, cela importe aussi pour le script ce même module (avec les alias/spécifications).

Mais déjà comment importer correctement un module externe ?
J'ai consulté pas mal de documentation, je n'ai rien trouvé de bien probant.
Alors, j'ai testé.
Et j'ai trouvé cette solution :

from sys import path as syspath
syspath.append("/CHEMIN/DU/RÉPERTOIRE/CONTENANT/LE/MODULE")
import NOM_DU_MODULE as mon_module



Est-ce correct ? En tous cas cela fonctionne.

On débâtera sur l'import nécessaire aux modules après wink

Merci de vos réponses.

Dernière modification par Tawal (06-10-2024 13:28:32)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#2 03-10-2024 16:21:18

David5647
Membre
Distrib. : Debian Sid
Noyau : 5.15.0-2-amd64
(G)UI : i3wm + des bouts de kde
Inscription : 27-08-2017

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Salut!

La méthode ne me semble pas très conventionnelle. J'ai jamais utilisé ça tongue

J'imagine que ce n'est pas recommandé pour des raisons de
     - maintenance : avoir un environnement stable pendant l’exécution, se souvenir où est configuré le chemin, ne pas avoir à modifier le code si le module change de place...
     - portabilité :  comment l'installer sur un autre système, il faudra adapter le chemin, donc modifier le code...
Après si c'est un petit projet pour toi, que tu comptes pas le faire fonctionner ailleurs que sur ton pc, ça permet d'importer rapidement le module sans mettre en place de choses plus longues et plus complexes. Y a pas de mal à ça.

Qu'entends tu par "avoir ses propres modules"?
Tu veux partager un module avec plusieurs projets ou veux tu organiser un projet avec plusieurs sous modules?

J'ai tendance à faire qqc de la sorte :

mon_projet/
├── mon_module/
│   ├── __init__.py
│   ├── fonctions.py
└── main.py
 

quitte à copier-coller le module dans plusieurs projets si besoin.
J'ai par exemple des petits bouts d'interface en ligne de commande (coloration, barre de progression) que je copie colle dans un projet lorsque nécessaire.
La méthode permet de rendre le projet facilement portable, un seul dossier à dupliquer, pas de code à modifier.
Le module est déjà accessible dans le pythonpath, un simple import suffit.

SI tu souhaites partager ton module entre plusieurs projets, je vois plusieurs méthodes alternatives:

     1. modifier le path python en modifiant la variable d'environnement:

Dans ton shell

export PYTHONPATH=$PYTHONPATH:/chemin/vers/ton/module


Puis dans ton script python:

import ton_module


Ca revient au même que ton code python, mais ça me semble plus "conventionnel"

     2. créer un paquet et l'installer

Là c'est déjà plus complexe, mais si tu veux bien emballer ton module dans quelque chose de propre et facilement utilisable, tu peux regarder par là. (c'est pas si compliqué que ça en vrai tongue )
Avec setuptools par exemple

On peut imaginer l'installer dans un environnement virtuel que tu n'aura qu'a activer quand tu en aura besoin:

python3 -m venv mon_environnement # Créer un environnement virtuel
source /chemin/vers/mon_environnement/bin/activate # Activer l'environnement
pip install /chemin/vers/mon_module # Installer le module
deactivate # Désactiver l'environnement


Quand tu as besoin du module, avant de lancer ton programme :

source /chemin/vers/mon_environnement/bin/activate


Et dans ton script python, un simple:

import mon_module



Voilà, c'est quelques pistes, peut-être y aura t'il des réponses plus pertinentes et rigoureuses sur la question des imports, mais c'est ce que je ferai spontanément.

PS : toujours travailler dans un environnement virtuel est une bonne pratique (pas de risque de casser son système, plus facile de contrôler la versions des paquets installés, plus facile à porter son projet sur un autre appareil...

Dernière modification par David5647 (03-10-2024 16:23:17)

Hors ligne

#3 04-10-2024 16:13:12

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Merci de ces conseils de pratique.

Je vais détailler un peu mon cas :
En effet, je veux créer un module qui soit utilisable par plusieurs scripts quelque soit leurs emplacement où le répertoire de lancement de ces scripts.
Je ne crée pas réellement de projet, juste des scripts applicatifs pour mon usage personnel (pas de portabilité prévue, ni de distribution).

Quand je regarde ma variable PYTHONPATH dans mon shell bash, elle est vide !
Pourtant j'importe sans erreur les modules "officiels".

À vrai dire, pour l'instant, je n'utilise pas d'environnement virtuel.
J'exécute mes scripts dans une application. Je pense que cette application (Golly) crée son environnement virtuel pour Python.
Car elle apporte un module "golly" directement "importable".
Ce même module ne m'est pas accessible dans un environnement virtuel, ni dans un shell Python.
Mais il existe d'autre module Python qui permettent de se passer de l'application pour traiter les données.
Et c'est donc là qu'interviendrait un environnement virtuel pour exploiter ces autres modules, OK

Mais comme je n'utilise (pour le moment) que l'application, je peux changer la variable PYTHONPATH qu'à l'intérieur d'un script/module.
Et je n'ai trouvé que ce moyen (post initial) pour importer un module externe perso.

Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 04-10-2024 21:24:28

Philou92
Adhérent(e)
Lieu : Hauts de Seine
Distrib. : Debian bookworm
Noyau : Linux 6.1.0-21-amd64
(G)UI : LightDM et Xfce4.18
Inscription : 29-04-2015

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Hello,

Pour importer tes modules externe tu as plusieurs solutions :
− les mettre dans le même répertoire.
− les mettre dans un répertoire du PYTHONPATH
− former un package

La solution que tu exposes est la bonne et correspond à la deuxième option.
Exemple un ficher python truc.py qui appelle le module machin situé dans un autre répertoire. Pour cela il faut faire appel à la méthode sys.path.append('chemindurépertoiredumodule')

Imaginons que le module machin est dans le répertoire /home/user/repertoireDuModule et comporte le code

/home/user/repertoireDuModule/machin.py

def bidule():
    print("plop")



Code principal

import sys
print("liste des répertoires du PYTHONPATH avant = ", sys.path)
sys.path.append('/home/user/repertoireDuModule')
print("liste des répertoires du PYTHONPATH après = ", sys.path)
import machin
print(machin.__file__)
machin.bidule()



Quelques soit le répertoire du code principal il importera le fichier machin.py (s’il a les droits en lecture sur le fichier  évidemment)

Note que la lecture du PYTHONPATH avant te montre que l’ensemble des modules de la distribution python sont déjà accessibles.

import os
print(os.__file__)


chez moi cela donne :
'/usr/lib/python3.11/os.py'


Tousse antique Ovide !

Hors ligne

#5 05-10-2024 07:43:13

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

OK, merci.
Donc, je n'étais pas trop dans l'(ho/e)rreur tongue

Mais comme l'explique David5647, cela pose un problème si le répertoire du module venait à bouger.
Du coup, je me demande si on ne pourrait pas créer une méthode pour trouver le chemin du module,
pour ensuite l'ajouter au PYTHONPATH et l'importer ?
Je pense que ça doit être possible, le tout évidemment avec une gestion des erreurs possibles (pas trouvé, corrompu …).


Edit:
Serait-il judicieux de placer mes modules persos dans : /usr/local/lib/python3.11 ou /usr/local/lib/python3.11/dist-packages ?
Le premier demande d'ajouter le répertoire au PYTHONPATH, pas le second.
Que va t-il se passer en cas de montée en version de Python ?

Edit2:
Le script peut connaître la version de Python utilisée (avec sys.version).
Donc je peux en tirer la version minimaliste (x ou x.y) :

import sys
ver = ".".join(sys.version.split(" ")[0].split(".")[:2])
ver_min = ver.split(".")[0]


Reste à transférer proprement les modules persos vers le nouveau répertoire de la (nouvelle) version Python …
Edit3:
Pourquoi je dis ça ?
Avec sys.version, un script peut facilement "fabriquer" le chemin vers les libs python locales (/usr/local/lib/python….).
Mais en cas de montée en version de Python, je ne suis pas sûr que les fichiers de /usr/local/lib/python_version_old soient transférés vers le nouveau dossier local de la version nouvellement installée.
Je pense d'ailleurs que lors de la montée en version de Python, apt m'avertira qu'il ne peut pas supprimer le répertoire /usr/local/lib/python… de l'ancienne version.
Donc MES fichiers seront toujours dans le répertoire de l'ancienne version et le répertoire de la nouvelle sera vide.
D'où le transfert nécessaire.

Dernière modification par Tawal (05-10-2024 16:30:31)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#6 05-10-2024 21:39:01

Philou92
Adhérent(e)
Lieu : Hauts de Seine
Distrib. : Debian bookworm
Noyau : Linux 6.1.0-21-amd64
(G)UI : LightDM et Xfce4.18
Inscription : 29-04-2015

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Je ne pense pas que bricoler les fichiers et répertoires de la distribution soit un bonne idée.
Il y a peut-être plus simple (réf. discussion là https://stackoverflow.com/questions/340 … pythonpath)
ajouter une ligne a ton fichier ~/.bashrc du style

export PYTHONPATH="${PYTHONPATH}:/chemin/vers/mes/modules"


Du coup si tu changes tes modules de place il n’y a plus qu’à modifier cette ligne.


Tousse antique Ovide !

Hors ligne

#7 06-10-2024 11:46:58

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Bon sang !
Pourquoi je ne vois pas la simplicité !
Merci, c'était assez évident smile

Cette solution est viable pour les environnements virtuels.
Mais quid de l'application Golly ? Je n'ai pas accès à son shell.
L'application Golly permet de lancer des scripts python au travers elle-même et permet le contrôle de l'application.


Edit:
Car j'ai bien compris l'importance des environnements virtuels :

$ python3 -c "import sys;print(sys.path)"
['', '/usr/lib/python311.zip', '/usr/lib/python3.11', '/usr/lib/python3.11/lib-dynload', '/usr/local/lib/python3.11/dist-packages', '/usr/lib/python3/dist-packages', '/usr/lib/python3.11/dist-packages']
$
$ source ~/Term/Python/Golly/bin/activate
(Golly) $ python3 -c "import sys;print(sys.path)"
['', '/usr/lib/python311.zip', '/usr/lib/python3.11', '/usr/lib/python3.11/lib-dynload', '/home/tawal/Term/Python/Golly/lib/python3.11/site-packages']
(Golly) $ deactivate
$




EDIT:
J'ai résolu mon problème avec l'application Golly :
Il est dit dans la documentation que Golly exécute au démarrage un fichier golly-start.py.
J'ai cherché ce fichier, il n'existe pas.
Je l'ai créé dans le répertoire de l'application avec ce contenu :

from sys import path as syspath
syspath.append("/Chemin/du/Répertoire/de/mes/Modules/Persos")


Et ça fonctionne.
Il me suffit ensuite d'importer le fichier voulu dans un script comme ceci par exemple :

from Mon_Module import *

Dernière modification par Tawal (06-10-2024 13:11:50)


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#8 06-10-2024 13:26:35

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Je mets en [Résolu] et j'ouvre un autre sujet toujours concernant les imports.
Mais cette fois ci :
   - mon module externe a besoin d'imports pour fonctionner
   - ma solution :
Mon module :

import re

def fonction_null():
   return None


Mon script :

from Mon_Module import *
regex = re.compile(r'^$')
valid = fonction_null()



Bref, ça vaut vraiment un autre sujet.


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 06-10-2024 14:29:42

vv222
Administrateur
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Philou92 a écrit :

Je ne pense pas que bricoler les fichiers et répertoires de la distribution soit un bonne idée.



/usr/local, contrairement au reste de /usr, n’est pas un chemin utilisé par la distribution. Au contraire celui-ci est réservé à l’administrateur local de la machine.


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

En ligne

#10 06-10-2024 21:28:38

Philou92
Adhérent(e)
Lieu : Hauts de Seine
Distrib. : Debian bookworm
Noyau : Linux 6.1.0-21-amd64
(G)UI : LightDM et Xfce4.18
Inscription : 29-04-2015

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Désolé je n’ai pas été assez précis. Je voulais évoquer la distribution python pas debian.

Tousse antique Ovide !

Hors ligne

#11 06-10-2024 21:40:59

Tawal
Membre
Distrib. : Debian Stable à jour
Noyau : amd64
(G)UI : Xfce
Inscription : 25-02-2021

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

vv222 a écrit :


/usr/local, contrairement au reste de /usr, n’est pas un chemin utilisé par la distribution. Au contraire celui-ci est réservé à l’administrateur local de la machine.


Oui, généralement. Et c'est ce que je pensais.
Mais je n'ai en aucun cas créé le répertoire /usr/local/lib/python3.11
C'est donc bien la distribution qui gère ce répertoire, non ?
Pour sûr, si Python passe à la version 3.12, j'aurais un répertoire /usr/local/lib/python3.12.
Et les fichiers personnels dans /usr/local/lib/python3.11 ne seront pas transférés vers l'autre.
Bref, on dépend de la version/distribution.


Comme la science n'est pas infuse, elle se diffuse.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#12 06-10-2024 22:45:23

Philou92
Adhérent(e)
Lieu : Hauts de Seine
Distrib. : Debian bookworm
Noyau : Linux 6.1.0-21-amd64
(G)UI : LightDM et Xfce4.18
Inscription : 29-04-2015

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Tawal a écrit :


Mais je n'ai en aucun cas créé le répertoire /usr/local/lib/python3.11
C'est donc bien la distribution qui gère ce répertoire, non ?


A priori oui.

Tawal a écrit :


Pour sûr, si Python passe à la version 3.12, j'aurais un répertoire /usr/local/lib/python3.12.
Et les fichiers personnels dans /usr/local/lib/python3.11 ne seront pas transférés vers l'autre.
Bref, on dépend de la version/distribution.


Je le pense aussi puisque je n’ai pas trace d’un répertoire python3.9. Sauf si la création de ce répertoire est une nouveauté de debian12. vv222 a peut-être une explication à ce sujet.

Sinon le seul répertoire /usr/local sur lequel le sys.path pointe par défaut est le répertoire /usr/local/lib/python3.11/dist-packages et aucunement vers /usr/local/lib/python3.11.


Tousse antique Ovide !

Hors ligne

#13 07-10-2024 01:30:53

vv222
Administrateur
Distrib. : Debian Sid
(G)UI : sway
Inscription : 18-11-2013
Site Web

Re : [Python 3] Importer correctement ses modules personnels [Résolu]

Tawal a écrit :

Mais je n'ai en aucun cas créé le répertoire /usr/local/lib/python3.11
C'est donc bien la distribution qui gère ce répertoire, non ?


En effet, c’est créé par un script fourni par le paquet python3.11-minimal, justement pour que ce soit à disposition de l’administrateur de la machine.

À mon avis c’est un mauvais choix de la part du mainteneur du paquet Debian, un administrateur ayant besoin de ces chemins devrait bien être capable de les créer lui-même.


Jouer sous Debian ? Facile !

Ceterum censeo Barum esse delendam

En ligne

Pied de page des forums