Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/10/2007, à 20:36

nico_h

[résolu] [python] pb facile import modules, classes etc.

salut à tous,


alors ça doit pas être bien dur mais j'arrive pas du tout à faire marcher un truc très simple :
(et je commence à m'arracher les cheveux car je n'arrive pas à mettre la main sur un tuto qui explique ça bien et avec exemples)

j'ai ceci :

répertoire de travail contenant ----> programme.py
                                          ----> répertoire paquet contenant : ----> __init__.py
                                                                                           ----> UneClasse.py

et j'aimerais utiliser des objets UneClasse dans programme.py
(le fichier UneClasse contient une définition de classe, bien sûr)

pour cela, j'ai simplement fait, dans programme.py : import paquet
(et ensuite, essayé avec from paquet import * : mêmes résultats)

ça il dit rien sur le coup, ça a l'air d'aller (j'en déduis qu'il a bien trouvé et identifié mon module)

par contre, si je veux instancier des choses, par exemple, créer une instance de UneClasse, pas moyen.

j'ai tenté, par exemple, de faire :

exemple = paquet.UneClasse(argument)

ou bien

exemple = UneClasse(argument)


il me dit soit que paquet étant un module, il n'est pas appelable !
soit que UneClasse n'est pas défini

c'est sans doute un problème de syntaxe quelque part mais j'arrive pas à trouver

bref, comment faire pour charger le module "paquet" qui contient la classe "UneClasse" et s'en servir ?

Dernière modification par nico_h (Le 30/10/2007, à 20:42)


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#2 Le 22/10/2007, à 20:45

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

bon, j'ai fini par avoir un truc qui marche en faisant :


from paquet import UneClasse


et là je fais :

mon_objet = UneClasse.UneClasse(blablabla)

mais ça va pas.

pourquoi quand je fais simplement import paquet, ça ne suffit pas ?


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#3 Le 23/10/2007, à 10:47

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

bon... personne peut m'aider ?

j'ai trouvé un truc qui ne marche pas tout le temps alors j'y comprends décidément rien...

en faisant import paquet

pour instancier un objet de la classe MaClasse contenue dans MaClasse.py dans le répertoire paquet, je dois faire :

objet = paquet.MaClasse.MaClasse(arguments...)

ce qui est ni très joli ni très pratique mais qui marchait hier soir et plus ce matin...

si quelqu'un peut m'indiquer un tutoriel sur la gestion des paquetages (comprenant des classes) en python, ce serait cool...


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#4 Le 23/10/2007, à 10:56

trucutu

Re : [résolu] [python] pb facile import modules, classes etc.

Si tu fais plutôt import UneClasse, ca marche mieux ?

D'une manière générale, si tu as des classes/fonctions à importer d'un fichier toto.py, tu fais import toto ou from toto import classe, fonction

Maintenant, si toto.py n'est pas dans le même répertoire que programme.py, il va peut être falloir que tu modifies la variable d'environnement PYTHON_PATH (où un truc dans le genre)


La chanson du dimanche - "La pêche !"
PC acheté chez Novatux : entièrement satisfait.
Faire des recherches solidaires !

Hors ligne

#5 Le 23/10/2007, à 11:00

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

ça y est : trouvé pourquoi ça marche plus ce matin.

en fait, dans le fichier __init__.py qu'on place dans un répertoire destiné à être un paquetage python, il faut mettre les instructions qui regroupent tous les trucs qu'on veut importer d'un seul coup quand on exécute import paquetage.

et ça c'est écrit nulle part, pas réussi à le trouver ni en doc, ni sur forum.

y'a toujours marqué le fichier __init__.py il peut rester vide...
ben oui, mais ça sert à rien !


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#6 Le 23/10/2007, à 21:39

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

bonsoir,


la solution avec from ... import ... ne m'intéresse pas tellement car le programme va être très modulaire et je n'ai pas envie à chaque fois de rajouter des morceaux dans la liste de trucs à importer.

si je fais import UneClasse, ça ne marche pas. il faudrait avoir un fichier nommé ainsi dans le répertoire où se trouve le script qui fait l'import.

pour le moment, la meilleure solution, c'est bien de rajouter dans le fichier __init__.py qu'on place dans le répertoire les instructions par exemple :

import CeModule
import LAutreModule
etc. etc.

comme ça, il va tous les chercher dès qu'on fait un import, au niveau au-dessus, sur le nom du répertoire qui contient l'__init__.py et les divers CeModule.py, LAutreModule.py etc.

un autre truc pas top, c'est que j'aimerais partager certaines constantes entre tous mes modules répartis dans les différents répertoires.

j'ai donc regroupé ces diverses constantes dans un fichier que j'ai appelé, de façon fantaisiste, commun.py

le problème c'est que pour le charger, déjà, faut que je rajoute '..' comme chemin dans la liste contenue dans sys.path

si quelqu'un connaît une solution pour éviter ce truc assez... moche...


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#7 Le 30/10/2007, à 20:39

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

le moins qu'on puisse dire, c'est qu'y'a pas foison d'explications pour les débutants sur le net, donc voici un exemple de contenu de fichier __init__.py pour éviter de s'arracher la tête tout seul dans son coin (sachant que c'est python 2.4, que des gros changements sont prévus en 3.0 encore à venir) :

en fait, tout passe par le fichier __init__.py

pour importer "correctement" un paquetage nommé pour l'exemple, objet_ il faut,
en plus d'avoir créé un répertoire appelé objet_ et contenant un fichier
__init__.py, indiquer tous les imports à faire.

par exemple :

# -*- coding: utf-8 -*-
# ------------------------------------------------------------------------------
# ------------------------------------------------- PAQUETAGE objet_ -----------
# ------------------------------------------------------------------------------
##
# @package objet_
# @brief Ce paquetage contient tous les objets de type objet_, c'est-à-dire les objets mathématiques.

import Litteral
import Polynomial
import Monome
import Polynome

ainsi, dans un script extérieur (ayant ce qu'il faut sous la main pour connaître le chemin du paquetage en question), l'instruction :

import objet_

me permet d'utiliser tous les modules de mon paquetage (càd ici ce qui est défini dans les fichiers Litteral.py, Polynomial.py etc.)

MAIS, truc moche, si on a placé une classe Monome dans le fichier Monome.py, après import de objet_, pour utiliser le constructeur de cette classe, il faut écrire :

nouveau_monome = objet_.Monome.Monome(...)

solution : spécifier des raccourcis dans le fichier init.

comme ça :

# -*- coding: utf-8 -*-
# ------------------------------------------------------------------------------
# ------------------------------------------------- PAQUETAGE objet_ -----------
# ------------------------------------------------------------------------------
##
# @package objet_
# @brief Ce paquetage contient tous les objets de type objet_, c'est-à-dire les objets mathématiques.

import Litteral
import Polynomial
import Monome
import Polynome

Litteral = Litteral.Litteral
Polynomial = Polynomial.Polynomial
Monome = Monome.Monome
Polynome = Polynome.Polynome

et là, après avoir importé objet_, je peux utiliser directement :



nouveau_monome = objet_.Monome(...)

Enfin, autre problème bizarre, parfois python ne refait pas le fichier *.pyc alors que le *.py correspondant a changé ! Du coup, on récupère des erreurs comme quoi, tel module ne définit pas tel objet... solution facile : virer les *.pyc

Et pour terminer, je signale aussi que l'ajout de '..' à la variable sys.path pour que tel module "enterré" aille chercher des modules dans les répertoires "au-dessus" de lui n'est pas nécessaire.

voilà !

Dernière modification par nico_h (Le 30/10/2007, à 20:42)


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#8 Le 30/10/2007, à 22:59

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

et en prime, un petit script pour virer récursivement tous les pyc gênants d'un seul coup :

#!/bin/bash

function purge
{
	pwd
	rm -rf *.pyc
	
	for fichier in `ls`
	do
		if [ -d $fichier ]
		then
			cd $fichier
			purge
			cd ..
		fi
	done
}

echo "Répertoires purgés de leurs *.pyc :"
purge

Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne

#9 Le 05/06/2008, à 21:38

Svear

Re : [résolu] [python] pb facile import modules, classes etc.

nico_h a écrit :

et en prime, un petit script pour virer récursivement tous les pyc gênants d'un seul coup :

#!/bin/bash

function purge
{
	pwd
	rm -rf *.pyc
	
	for fichier in `ls`
	do
		if [ -d $fichier ]
		then
			cd $fichier
			purge
			cd ..
		fi
	done
}

echo "Répertoires purgés de leurs *.pyc :"
purge

find . -name "*.pyc" -exec rm -f {} \;

#10 Le 23/07/2008, à 09:39

nico_h

Re : [résolu] [python] pb facile import modules, classes etc.

ouaip, j'y avais pas pensé !

précision concernant mon problème initial sur les classes à importer d'un sous-répertoire : selon le côté plus ou moins pratique, je suis resté à la solution du post #7 ou bien j'utilise une autre solution consistant à regrouper toutes les classes dans le fichier __init__.py du sous-répertoire. en faisant comme ça, je peux faire depuis le répertoire principal, directement (en gardant l'exemple du post #1) :
import paquet
et utiliser directement paquet.UneClasse

ou bien from paquet import *
et utiliser directement UneClasse

cette dernière solution est plus élégante mais lorsqu'on a un sous-répertoire destiné à contenir un nombre de classes grandissant, donne un fichier rapidement volumineux et peu maniable le jour où l'on veut travailler sur telle classe perdue en plein milieu du fichier... (faut un IDE/éditeur avec un bon navigateur de classes) ou lorsqu'on veut comparer telle et telle (pour des modifs de structure) etc.


Config. actuelle : linux mint 22.04 | FreeBSD 12
Des exercices d'entraînement en maths : http://mr.hainaux.net/

Hors ligne