Accéder aux sous-modules

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille avec Python 3.4 et j'ai la structure de dossier suivante :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
mpf/
    __init__.py
    main.py
    analysis/
        __init__.py
        abstracts.py
        production/
            __init__.py
            moving_averaging.py
            linear_regression.py
            linear_regression_error_stats.py
            views/
                __init__.py
                abstracts.py
                crude.py

Dans mon main.py, je charge le module analysis.production de la sorte :

1
from mpf.analysis import production

Puis j'en affiche le contenu :

1
2
print(dir(production))
>>> ['LinRegErrorStats', 'LinearRegression', 'MovingAveraging', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'linear_regression', 'linear_regression_error_stats', 'moving_averaging']

Le mpf/analysis/production/__init__.py contient cela :

1
2
3
from .moving_averaging import MovingAveraging
from .linear_regression import LinearRegression
from .linear_regression_error_stats import LinRegErrorStats

et le mpf/analysis/production/views/__init__.py cela :

1
from . import crude

Mais, depuis le main.py, un view = production.views.crude.View() me retourne une erreur : AttributeError: 'module' object has no attribute 'views'.

Merci. ^^

+0 -0

En Python 3, les sous-packages ne sont pas importés automatiquement. Il faut que dans ton module ...\production\__init__.py tu importes le sous-package views.

Edit: Pour être plus précis, quand tu importes un package, Python ne lit que le __init__.py.

+0 -0

C'est ce que j'avais fait au départ, et ça fonctionnait : je pouvais importer, depuis main.py, le module mpf.analysis.production.views. Mais, par contre, il y a toujours une erreur pour mpf.analysis.production.views.crude.

mpf/analysis/production/__init__.py :

1
2
...
import views

main.py :

1
2
3
4
5
6
7
from mpf.analysis import production

print(dir(production))
>>> ['LinRegErrorStats', 'LinearRegression', 'MovingAveraging', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'linear_regression', 'linear_regression_error_stats', 'moving_averaging', 'views']

print(dir(production.views))
>>> ['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

D'ailleurs, pourquoi puis-je importer production de mpf.analysis alors que mon mpf/analysis/__init__.py contient uniquement cela :

1
from .abstracts import AbstractAnalysis

Merci !

PS : dans les __init__.py, est-il préférable de faire from .blabla import truc ou from mpf.module.blabla import truc ? La seconde méthode m'avait posé des problèmes, mais j'ignore un peu pourquoi.

+0 -0

C'est ce que j'avais fait au départ, et ça fonctionnait : je pouvais importer, depuis main.py, le module mpf.analysis.production.views. Mais, par contre, il y a toujours une erreur pour mpf.analysis.production.views.crude.

mpf/analysis/production/__init__.py :

1
2
...
import views

main.py :

1
2
3
4
5
6
7
from mpf.analysis import production

print(dir(production))
>>> ['LinRegErrorStats', 'LinearRegression', 'MovingAveraging', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'linear_regression', 'linear_regression_error_stats', 'moving_averaging', 'views']

print(dir(production.views))
>>> ['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']

Vayel

Tu as oublié le . devant le views pour ton import, du coup tu importe probablement un autre module views extérieur à toute cette arborescence.

D'ailleurs, pourquoi puis-je importer production de mpf.analysis alors que mon mpf/analysis/__init__.py contient uniquement cela :

1
from .abstracts import AbstractAnalysis

Vayel

Parce que tu l'importes explicitement avec from mpf.analysis import production. Tu pourrais aussi bien faire from mpf.analysis.production import views.


Concernant les imports absolus ou relatifs, dans un package il est bien plus judicieux d'utiliser les relatifs. Ainsi tu pourras facilement modifier/corriger/déplacer tes modules et tes sous-packages sans avoir besoin de modifier tous les imports dans les modules.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte