web-dev-qa-db-fra.com

Importation de modules In Python et __init__.py

J'ai lu sur la fonction de __init__.py déposer. On dit que nous avons besoin d'un __init__.py Fichier dans le dossier contenant des modules, de sorte 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 __init__.py Fichier, je peux toujours importer les modules de ce dossier. Pourriez-vous expliquer comment ces modules peuvent être importés sans l'existence d'un __init__.py?

Merci,

Meilleures salutations

27
alwbtc

__init__.py active un dossier en un paquet . Ceci est utile pour créer une sorte de hiérarchie de modules, où vous pouvez avoir des déclarations importées comme ceci:

import mymodule.cool.stuff

Ce n'est pas possible sans paquets.

18
Björn Pollex

La différence entre avoir _ init _. Py et ne pas avoir un dans votre répertoire de module est:

Quand vous avez__init__.py (vierge), vous pouvez importer le module en utilisant

from dirname import MyModule

Mais quand vous N'a-vous pas _ init _. Py du tout, vous ne pouvez pas importer le module sans ajouter le chemin que ce module à pythonpath. Dans ce casfrom dirname import MyModule[~ # ~] échoue [~ # ~ ~], ou signale une erreur.

# Structure du 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 :

# non _ init _. Py, de la déclaration du module d'importation de dir Importer une 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]#

# non _ init _. Py, déclaration d'importation - 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]#

# no _ init _. Py, chemin d'insertion dans PythonPath, instruction de module d'importation après insertion de chemin - Travaux

[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]#

# ayant _ init _. Py, sans insertion de chemin, de la déclaration du module d'importation DIR - Travaux

[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

# ayant _ init _. Py, aucun insert de chemin, instruction de module d'importation - 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

De succès, les sous-dossiers peuvent être ajoutés à cette question

9
user966588

Si un répertoire (dossier) contient un __init__.py Fichier puis il devient un paquet. Ce que vous pensiez que vous lisiez n'était pas strictement correct, comme vous l'avez trouvé. Un paquet peut être importé comme s'il s'agissait d'un module en soi et de tout code de __init__.py est couru, bien qu'il soit souvent vide. Les packages sont un moyen de regrouper plusieurs modules ensemble et vous pouvez les charger en utilisant:

import package-name.module-name

Les colis peuvent également être imbriqués et sont souvent. Regardez dans le répertoire libéro sous votre Python répertoire logiciel pour de nombreux exemples.

9
cdarke