Importation de modules en Python et init.py

J'ai lu sur la fonction du fichier __init__.py. Il est dit que nous avons besoin d'un fichier __init__.py vide dans le dossier qui contient les modules, afin que ces modules puissent être importés. Cependant, j'ai essayé d'ajouter un chemin de dossier à PYTHONPATH (Variable d'environnement dans Windows 7). Bien que ce dossier ne contienne pas de fichier __init__.py, Je peux toujours importer les modules de ce dossier. Pourriez-vous veuillez expliquer comment ces modules peuvent être importés sans l'existence d'un __init__.py?

Merci,

Cordialement

26
demandé sur alwbtc 2011-05-06 14:58:20

4 réponses

__init__.py transforme un dossier en un paquet . Ceci est utile pour créer une sorte de hiérarchie de modules, où vous pouvez avoir des instructions d'importation comme ceci:

import mymodule.cool.stuff

Ce n'est pas possible sans paquets.

18
répondu Björn Pollex 2011-05-06 11:02:06

Si un répertoire (dossier) contient un fichier __init__.py, il devient un paquet . Ce que vous pensiez avoir lu n'était pas strictement correct, comme vous l'avez trouvé. Un paquet peut être importé comme s'il s'agissait d'un module par lui-même, et tout code dans __init__.py est exécuté, bien qu'il soit souvent vide. Les paquets sont un moyen de regrouper plusieurs modules ensemble, et vous pouvez les charger en utilisant:

import package-name.module-name

Les paquets peuvent également être imbriqués, et le sont souvent. Regardez dans le répertoire Lib sous votre répertoire logiciel Python pour beaucoup exemple.

9
répondu cdarke 2011-05-06 11:02:20

La différence entre avoir _init_.py et pas avoir dans votre répertoire de module est:

Lorsque vous avez __init__.py (vide un), vous pouvez importer le module en utilisant

from dirname import MyModule

Mais quand vous n'avez pas _init _. py du tout, vous ne pouvez pas importer le module sans ajouter le chemin jusqu'à ce module à PYTHONPATH. Dans ce cas from dirname import MyModule ÉCHOUE, ou des rapports d'erreur.

# la Structure de répertoire/Module sans _init_.py

[root@Machine python]# cd NoInitModule/
[root@Machine NoInitModule]# pwd
/python/NoInitModule
[root@Machine NoInitModule]# ls -l
total 4
-rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py

# Structure du répertoire / Module avec _ init_. py

[root@Machine NoInitModule]# cd ../InitModule/
[root@Machine InitModule]# ls -l
total 4
-rw-r--r--. 1 root root  0 Jan 16 07:13 __init__.py
-rw-r--r--. 1 root root 49 Jan 16 07:12 ModuleY.py
[root@Machine InitModule]#

Exemples:

# N' _init_.py, de dir module d'importation de l'instruction NE fonctionne PAS

[root@Machine python]# cat impomod.py
from NoInitModule import ModuleX

ModuleX.printBye()

[root@Machine python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 7, in <module>
    from NoInitModule import ModuleX
ImportError: No module named NoInitModule
[root@Machine python]#

# N' _init_.py, l'importation de l'instruction NE fonctionne PAS

[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX

ModuleX.printBye()
[root@Machine python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 8, in <module>
    import ModuleX
ImportError: No module named ModuleX
[root@Machine python]#

# non _ init_. py, insérez le chemin dans PYTHONPATH, importez l'instruction module après insérer un chemin-fonctionne

[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path

import ModuleX
ModuleX.printBye()

[root@Machine python]# python impomod.py
Bye from Module X with no __init__.py
[root@Machine python]#

# avoir _ init_. py, pas D'insertion de chemin, de dir import Module statement-WORKS

[root@Machine python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[root@Machine python]#

[root@Machine python]# python impXmod.py
See you from Module Y having __init__.py

# avoir _ init_. py, pas D'insertion de path, import Module statement-ne fonctionne pas

[root@Machine python]# vim impXmod.py
[root@Machine python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()

[root@Machine python]# python impXmod.py
Traceback (most recent call last):
  File "impXmod.py", line 3, in <module>
    import ModuleY
ImportError: No module named ModuleY

Bien sûr, le problème des sous-dossiers peut être ajouté à ce

9
répondu 2014-01-16 15:38:54

Oui, cela fonctionne, comme vous pouvez le dire. La raison pour laquelle le fichier __init__.py vide est de marquer sous-dossiers {[4] } comme des dossiers contenant des modules.

Donc, un dossier dans PYTHONPATH est ok pour avoir des modules, mais tous les sous-dossiers de ces dossiers doivent avoir un fichier __init__.py pour pouvoir importer des modules à partir d'eux.

6
répondu quamrana 2011-05-06 11:03:23