Python3 problème d'import Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Bonjour,

J'ai un problème d'import de "modules" avec Python3.

Mon architecture :

Code : Tout sélectionner

test.py
/modules/__init__.py
/modules/config.py
/modules/notification.py
J'arrive à importer depuis le script 'test.py', le script 'config.py'.

Un "from modules import config", dans le script 'test.py' fonctionne très bien.

Mais le code suivant dans le script 'config.py' ne fonctionne pas :

Code : Tout sélectionner

try:
    from modules import notification
except ImportError:
    print(f'Cant import notification module onto Config')
    sys.exit(1)
Lors de l'exécution, la console Python m'avertit qu'il ne peut importer le module 'notification' dans 'config', tel que :
Cant import notification module onto Config
Soit, je m'y prends mal... ce qui m'est sûr, c'est qu'en py2, ça fonctionne correct !
Donc, il y a quelque chose que j'ai du mal comprendre...
mais quoi ? une idée ?

Merci d'avance.

----

PS : Pour info, le script '__ini_.py' renferme ce code - bien pratique ; mais je sais qu'il peut être vide, sans soucis - :

Code : Tout sélectionner

import glob
import os

dirname = os.path.dirname(os.path.abspath(__file__))

files = glob.glob(dirname + '/*.py')

liste = []

me = os.path.basename(__file__)

for fich in files:
    (path, File) = os.path.split(fich)
    if os.path.isfile(fich) and File != me:
        (name, ext) = os.path.splitext(File)
        if name != '__init__' and not name in liste:
            liste.append(name)

__all__ = liste
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
thuban
Contributeur
Contributeur
Messages : 67
Inscription : 07 mai 2016, 15:32
Contact :
Status : Hors-ligne

Code : Tout sélectionner

 import .notification

?
Avatar de l’utilisateur
thuban
Contributeur
Contributeur
Messages : 67
Inscription : 07 mai 2016, 15:32
Contact :
Status : Hors-ligne

tout dépend aussi d'où tu lances ton fichier .py.
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

le fichier 'test.py' depuis sa racine, ni plus ni moins !
le script 'config.py' n'est pas appelé directement...
apparement, j'ai du mal à m'exprimer ?!

'config.py' est appelé par 'test.py' et appelle le script 'notification.py' !
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

thuban a écrit : 02 mars 2018, 21:34

Code : Tout sélectionner

 import .notification

?
"Invalid syntaxe !" est le message d'erreur retourné !
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
Arnaud
Membre
Membre
Messages : 162
Inscription : 23 avr. 2016, 14:31
Localisation : Allemagne
Status : Hors-ligne

Est-ce que le fichier test.py est lancé avec l'option -m ?

Code : Tout sélectionner

python3 -m test.py
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

non ?
Il est exécuté depuis IDLE... ou dans un terminal, mais jamais utilisé cette option.

Pourquoi il faudrait que j'exécute avec l'option '-m' ?

Code : Tout sélectionner

$ python3 -m test.py                                                                                   
/usr/local/bin/python3: Error while finding module specification for 'test.py' (AttributeError: module 'test' has no attribute '__path__')
Tiens, bizarre cette erreur, que je n'obtiens pas en l'exécutant normalement !?!
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
Arnaud
Membre
Membre
Messages : 162
Inscription : 23 avr. 2016, 14:31
Localisation : Allemagne
Status : Hors-ligne

L'option m permet d'importer implicitement un package et d'exécuter chaque composant comme un script. Je ne suis pas sûr que cela résolve ton problème, mais je me demande si ce n'est pas lié.
L'erreur que tu mentionnes est probablement liée au fait que PYTHONPATH ne soit pas renseigné correctement.

Quelques explications ici : https://stackoverflow.com/questions/222 ... ion-or-not

( en anglais )
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Je voudrais bien voir que j'ai un problème de path !!!
(étant donné comment semble fonctionner Py3)

Ci-dessous les liens vers mon dépôt framagit :
- Le fichier test.py - dont l'inclusion du module "config" se fait ligne 359
- Le fichier config.py - dont l'inclusion, entres autres du script notification.py, se fait quasiment dès le début, cf lignes 22 à 26 !
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Avatar de l’utilisateur
Arnaud
Membre
Membre
Messages : 162
Inscription : 23 avr. 2016, 14:31
Localisation : Allemagne
Status : Hors-ligne

Bon, en jetant un oeil rapidement sur ton code, on voit que ma réponse ne pourra pas t'aider. Est-ce que je me trompe en pensant que tu essayes d'adapter un code Python2 en Python3 ?

Le try ... except ... sur l'import va capturer toutes les erreurs provoquées lors de l'import du fichier notification.py. En mettant ton propre message d'erreur, tu ne voies pas apparaître les réelles erreurs.
Et la première dépendance apparaît au début du fichier : as-tu installé le module pynotify dans la version 3 ?
Avatar de l’utilisateur
PengouinPdt
Contributeur
Contributeur
Messages : 1343
Inscription : 23 avr. 2016, 23:37
Localisation : 47/FR
Diaspora* : https://framasphere.org/u/hucste
Contact :
Status : Hors-ligne

Ahahhh, bien vu @Arnaud !
Et, en effet, j'ai beau avoir le package 'py-notify', ce n'est pas pour Py3 !

Remplacement par notify2

Merci :D
PengouinPdt { le seul, le vrai } ~ " Libre as a Pengouin "
- DIY - Debian Sid | Devuan Ceres
----
Ne réponds pas aux PM d'assistance
Répondre